绘制任意斜率的直线_第1页
绘制任意斜率的直线_第2页
绘制任意斜率的直线_第3页
绘制任意斜率的直线_第4页
绘制任意斜率的直线_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、.淮海工学院计算机工程学院实验报告书课程名: 计算机图形学 题 目: 绘制任意斜率的直线 班 级: 测绘121 学 号: 27 姓 名: 王其芳 评语:成绩: 指导教师: 批阅时间: 年 月 日.一、实验目的或要求1. 掌握任意斜率直线的绘制算法。2. 掌握直线中点Bresenham算法的基本原理,能够用VC+实现该算法。二、 实验内容1、掌握直线段的生成算法,并用C+实现算法,包括中点法生成直线。2、编程实现DDA算法、Bresenham算法、中点画线法绘制直线段三、实验代码1、生成直线的DDA算法算法思想:一个坐标轴上以单位间隔增量,决定另一个坐标轴上最靠近线段路径的对应整数值。假定x2x

2、1的绝对值大于y2y1的绝对值,取x为一个象素单位长,即x 每次递增一个象素,然后利用下式计算相应的y值:yk+1ykyykmx 对于|m|1的线段,可通过计算由Y方向的增量y引起的改变来生成直线: xk+1xkxxkmy生成直线的DDA算法思想是源用初中直线的方程得出来的,而生成直线的中点算法是通过将DDA算法的方程式改为隐函数形式,然后通过与中点的比较确定该取的像素,绘制图线。/* DDA */#includevoid linedda(int x0,int y0,int x1,int y1,int color)int x,dy,dx,y;float m;dx=x1-x0;dy=y1-y0;

3、m=dy/dx;y=y0;for(x=x0;x=x1;x+)putpixel(x,(int)(y+0.5),color);y+=m;main()int a,b,c,d,e;int graphdriver=DETECT;int graphmode=0;initgraph(&graphdriver,&graphmode,);cleardevice();a=0;b=100;c=200;d=300;e=200;linedda(a,b,c,d,e);getch();closegraph();运行结果:VC+环境:#include #include / 四舍五入int Round(float x)retu

4、rn (int)(x abs(y2 - y1) ? abs(x2 - x1) : abs(y2 - y1);x = (float)x1;y = (float)y1;cx = (float)(x2 - x1) / steps;cy = (float)(y2 - y1) / steps;for(int i = 0; i steps; i+)putpixel(Round(x), Round(y), color);/ 在坐标 (x, y) 处画一个 color 颜色的点x += cx;y += cy;/ 主函数void main()initgraph(640, 480);/ 测试画线Line_DDA(

5、100, 100, 100, 478, RED);/ 按任意键退出getch();2、Bresenham直线算法是用来描绘由两点所决定的直线的算法,它会算出一条线段在 n 维光栅上最接近的点。这个算法只会用到较为快速的整数加法、减法和位元移位,常用于绘制电脑画面中的直线。是计算机图形学中最先发展出来的算法。 Bresenham画法与中点法相似,都是通过每列象素中确定与理想直线最近的像素来进行直线的扫描的转换的。通过各行、各列的象素中心构造一组虚拟网格线的交点,然后确定该列象素中与此交点最近的像素。该算法的巧妙之处在于可以采用增量计算,使得对于每一列,只需要检查一个误差项的符号,就可以确定该列的

6、所有对象。根据直线的斜率确定选择变量在X方向上或在Y方向上每次递增一个单位,另一变量的增量为0或1,它取决于实际直线与最近网格点位置的距离,这一距离称为误差。设第k步的误差为ek,选取上面象素点后的积累误差为:ek+1ek(m1)选取下面的象素点后的积累误差为:ek+1ekm/* Bresenham */程序代码如下:#include #include / 使用 Bresenham 算法画任意斜率的直线(包括起始点,不包括终止点)void Line_Bresenham(int x1, int y1, int x2, int y2, int color)int x = x1;int y = y1

7、;int dx = abs(x2 - x1);int dy = abs(y2 - y1);int s1 = x2 x1 ? 1 : -1;int s2 = y2 y1 ? 1 : -1;bool interchange = false;/ 默认不互换 dx、dyif (dy dx)/ 当斜率大于 1 时,dx、dy 互换int temp = dx;dx = dy;dy = temp;interchange = true;int p = 2 * dy - dx;for(int i = 0; i = 0)if (!interchange)/ 当斜率 1 时,选取左右象素点x += s1;p -=

8、2 * dx;if (!interchange)x += s1;/ 当斜率 1 时,选取 y 为步长p += 2 * dy;/ 主函数void main()initgraph(640, 480);/ 测试画线Line_Bresenham(10, 100, 100, 478,BLUE);Line_Bresenham(10, 478, 638, 1, RED);/ 按任意键退出getch();运行结果如下:3、生成直线的中点算法算法思想:中点算法主要是利用椭圆的正负划分性,利用已知或以求出的点,根据递推关系来判断下一个点的位置。中点算法有效地消除了DDA浮点运算效率低下的问题,将直线的斜率m转化为

9、可加的数,然后通过中点来确定要选择的点,这样使得中点算法的效率大大提高,使之成为被图形软件广泛采用的算法之一。 代码如下:#include #include / 使用中点算法画任意斜率的直线(包括起始点,不包括终止点)void Line_Midpoint(int x1, int y1, int x2, int y2, int color)int x = x1, y = y1;int a = y1 - y2, b = x2 - x1;int cx = (b = 0 ? 1 : (b = -b, -1);int cy = (a = 0 ? 1 : (a = -a, -1);putpixel(x,

10、y, color);int d, d1, d2;if (-a = b)/ 斜率绝对值 = 1d = 2 * a + b;d1 = 2 * a;d2 = 2 * (a + b);while(x != x2)if (d 1d = 2 * b + a; d1 = 2 * b;d2 = 2 * (a + b);while(y != y2) if(d 0)d += d1; else x += cx, d += d2; y += cy; putpixel(x, y, color); / 主函数void main()initgraph(640, 480);/ 测试画线Line_Midpoint(100, 50, 100, 478, GREEN);Line_Midpoint(1, 478, 638, 1, BLUE);/ 按任意键退出getch();四、实验结果1、该程序实现了三种算法的直线段绘制2、比较三种算法的结果:像素逼近效果由好到差依次为:Bresenham算法、DDA算法、中点算法执行速度由快到慢

温馨提示

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

评论

0/150

提交评论