计算机图形学课程设计报告1_第1页
计算机图形学课程设计报告1_第2页
计算机图形学课程设计报告1_第3页
计算机图形学课程设计报告1_第4页
计算机图形学课程设计报告1_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

设计目的 运用 DDA 算法画出斜率各不同的直线 包括大于 1 小于 1 等于 1 大于 1 小于 1 无穷大 设计思路 写出设计所参考的理论或算法步骤 已知过端点 P0 x0 y0 P1 x1 y1 的直线段 L y kx b 直线斜率为 这种方法直观 但效率太低 因为每一步需要一次浮点乘法和一次舍入运算 计算 yi 1 kxi 1 b kxi b k x yi k x 当 x 1 yi 1 yi k 即 当 x 每递增 1 y 递增 k 即直线斜率 注意上述分析的算法仅适用于 k 1 的情形 在这种情况下 x 每增加 1 y 最多增 加 1 当 k 1 时 必须把 x y 地位互换 主要程序代码 void LineDDA int x0 int y0 int x1 int y1 int color if dx 0 x x0 y min y0 y1 while y max y0 y1 putpixel int x int y color y y 1 delay 1000 else m dy dx if fabs m 1 x min x0 x1 if x x0 y y0 else y y1 for x max x0 x1 x putpixel int x int y 0 5 color y m delay 1000 else y min y0 y1 if y y0 x x0 else x x1 for y max y0 y1 y 01 01 xx yy k 10 yroundx bkxy stepxxxxxx 令 putpixel int x 0 5 int y color x 1 m delay 1000 运行效果 抓图及文字说明 设计目的 中点算法画直线的设计与实现 运用中点算法画出斜率各不同的直线 包括大于 1 小于 1 等于 1 大于 1 小 于 1 无穷大 设计思路 写出设计所参考的理论或算法步骤 中点画线算法的原则是 如下图所示 但斜率 K0 这线更靠近 E 点 下一点选择为 E 点 反之选择 NE 点 首先 f x y ax by c 0 且 y dy dx x B so f x y dy x dx y Bdx 0 so a dy b dx c Bdx 假设 已经选定 P 点 应用中点法则选择下一点是 我们只要计算 f x 1 y 1 2 并考察是正数还是负数 我们定义 d f x 1 y 1 2 a x 1 b y 1 2 c 这样 对于 d 0 d 0 我们只要选择 NE 点和 E 点就可以了 这边假设选定为 E 点 那么中点 M 的位置怎么变化和 d 的值如何变化呢 显然 M 就沿着 x 轴递增一 步 此时 d1 f x 2 y 1 2 从 d1 中减去 d 可以得到一个增量差 d1 a dy 同理 如果选定下一点为 NE 点 d2 a b dy dx 基于上面的讨论 增量的中点技术可以概括为 在每一步 我们根据上一步所 得到的增量的符号去选择下一个像素点 然后根据说选择的像素 判定变量增 加相应的增量差 d1 或 d2 对于初始值 我们选择第一个端点为 x0 y0 则 M 为 x0 1 y 1 2 f x0 1 y0 1 2 f x0 y0 a b 2 故 d0 a b 2 dy dx 2 为去掉 d0 中的小数 我们对 d0 进行放大 在方程两边同乘于 2 d0 2 dy dx d1 2 dy d2 2 dy dx 主要程序代码 void MidPointLine int x0 int y0 int x1 int y1 int color if dx 0 k 为无穷大为无穷大 y min y0 y1 x x0 while y max y0 y1 putpixel x y color delay 1000 y else if dy 0 k 0 else k dy 1 0 dx if k0 0 k 1 x min x0 x1 if x x0 y y0 dy dy else y y1 dx dx d dx 2 dy incrE 2 dy incrNE 2 dx dy putpixel x y color while x0 x d incrE else y x d incrNE putpixel x y color delay 1000 else if k 1 when k 1 else if k 1 当 d1 d20 时 yi 1 yi 1 pi 1 2dy 2dx pi 当 pi 0 时 p2 p1 2dy 2dx 当 p1 0 时 p2 p1 2dy 由此得出算法 主要程序代码 int BresenhamLine int x0 int y0 int x1 int y1 int color d 0 if dx 0 y min y0 y1 x x0 for i 0 i fabs dy i putpixel x y color delay 1000 y return 1 if dy 0 k dy dx if k0 0 k 1 x min x0 x1 if x x0 y y0 else y y1 for i 0 i 0 5 y d d 1 x x 1 putpixel x y color delay 1000 if k 1 if k 1 int x 0 y r while x y putdot x0 y0 x y color if d F xi yi 向右 向圆外 Pi 在圆外时 F xi yi 0 向下 向圆内 即求得 Pi 点后选择下一个象素点 Pi 1 的规则为 当 F xi yi 0 取 xi 1 xi 1 yi 1 yi 当 F xi yi 0 取 xi 1 xi yi 1 yi 1 这样用于表示圆弧的点均在圆弧附近 且使 F xi yi 时正时负 故称正负法 主要程序代码 void PNACircle int x0 int y0 int r int color x 0 y r putdot x0 y0 x y color x 1 putdot x0 y0 x y color d 1 while y 0 if d 0 d d 2 y 1 y else d d 2 x 1 x putdot x0 y0 x y color 运行效果 抓图及文字说明 设计目的 中点算法画椭圆的设计与实现 运用类似中点算法画椭圆的方法画出椭圆 设计思路 写出设计所参考的理论或算法步骤 1 输入椭圆的两个半径 r1 和 r2 并且输入椭圆的圆心 设置初始点 x0 y0 的位置为 0 r2 2 计算区域 1 中央决策参数的初始值 p ry ry rx rx ry 1 4 rx rx 3 在区域 1 中的每个 Xn 为止 从 n 0 开始 直到 K 斜率 小于 1 时后结束 1 如果 p 0 绘制下一个点 x 1 y 1 并且计算 p p r2 r2 3 2 point x 2 r1 r1 y 1 4 设置新的参数初始值 p ry ry X0 1 2 X0 1 2 rx rx Y0 1 rx rx ry ry 5 在区域 2 中的每个 Yn 为止 从 n 0 开始 直到 y 0 时结束 1 如果 P 0 的情况下 下一个目标点为 x y 1 并且计算 p p 2rx rx Yn 1 rx rx 2 如果 p 0 的情况下 下一个目标点为 x 1 y 1 并且计算 p p 2rx rx Y n 1 2ry ry Xn 1 rx rx 6 更具对称性原理计算其他 3 个象限的坐标 7 急速拿出中心位置在 x1 y1 的位置 x x x1 y y y1 主要程序代码 void MidpointEllipse long x0 long y0 long a long b int color squarea a a squareb b b xP long float squarea float sqrt float squarea squareb yP long float squareb float sqrt float squarea squareb x 0 y b d 4 squareb squarea b squarea EllipsePoints x0 y0 x y RED while x xP if d 0 d 4 squareb 2 x 3 else d 4 squareb 2 x 3 4 squarea 2 2 y y x EllipsePoints x0 y0 x y RED x a y 0 d 4 squarea a squareb squareb EllipsePoints x0 y0 x y RED while y yP if d 0 d 4 squarea 2 y 3 else d 4 squarea 2 y 3 4 squareb 2 2 x x y EllipsePoints x0 y0 x y RED 运行效果 抓图及文字说明 设计目的 扫描转换矩形 确定那些像素位于填充图元的内部 确定以什么颜色填充这些像素 设计思路 写出设计所参考的理论或算法步骤 矩形确定边界 所以只要把矩形内部的点填充成所要的颜色即可 主要程序代码 void FillRectangle int xmin int xmax int ymin int ymax int color int x y for y ymin y ymax y for x xmin xtop NULL i x while getpixel i y oldcolor putpixel i y newcolor i span xRight i 1 i x 1 while getpixel i y oldcolor putpixel i y newcolor i span xLeft i 1 确定区段左边界确定区段左边界 setstackempty s 初始化初始化 span y y pushstack s 将前面生成的区段压入堆栈将前面生成的区段压入堆栈 while isstackempty s popstack s y span y 1 处理上面扫描线处理上面扫描线 xRight span xRight i span xLeft 1 isleftendset false while getpixel i y oldcolor 向左填充向左填充 putpixel i y newcolor i if i span xLeft 1 确定区段左边界确定区段左边界 isleftendset true xLeft i 1 i span xLeft while i xRight spanneedfill false while getpixel i y oldcolor 向右填充向右填充 if spanneedfill spanneedfill true if isleftendset isleftendset true xLeft i putpixel i y newcolor i if spanneedfill span y y span xLeft xLeft span xRight i 1 pushstack s 将区段压入堆栈将区段压入堆栈 isleftendset false spanneedfill false while getpixel i y oldcolor i y y 2 处理下面一条扫描线处理下面一条扫描线 与处理上面一条扫描线完全类似与处理上面一条扫描线完全类似 xRight span xRight i span xLeft 1 isleftendset false while getpixel i y oldcolor 向左填充向左填充 putpixel i y newcolor i if i span xLeft 1 确定区段左边界确定区段左边界 isleftendset true xLeft i 1 i span xLeft while ileft 线段与窗口的左边求交线段与窗口的左边求交 y y0 y1 y0 rect xmin x0 x1 x0 x float rect xmin else if outCodeOut top 线段与窗口的上边求交线段与窗口的上边求交 x x0 x1 x0 rect ymax y0 y1 y0 y float rect ymax else if outCodeOut right 线段与窗口的右边求交线段与窗口的右边求交 y y0 y1 y0 rect xmax x0 x1 x0 x float rect xmax else if outCodeOut bottom 线段与窗口的下边求交线段与窗口的下边求交 x x0 x1 x0 rect ymin y0 y1 y0 y float rect ymin if outCodeOut all outCode0 all x0 x y0 y CompOutCode x0 y0 rect else x1 x y1 y CompOutCode x1 y1 rect while done if accept 显示线段的可见部分显示线段的可见部分 line int x0 int y0 int x1 int y1 if ac

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论