计算机图形学 实验一直线生成算法报告

上传人:bao****ty 文档编号:117183167 上传时间:2019-11-18 格式:DOC 页数:9 大小:130KB
返回 下载 相关 举报
计算机图形学 实验一直线生成算法报告_第1页
第1页 / 共9页
计算机图形学 实验一直线生成算法报告_第2页
第2页 / 共9页
计算机图形学 实验一直线生成算法报告_第3页
第3页 / 共9页
计算机图形学 实验一直线生成算法报告_第4页
第4页 / 共9页
计算机图形学 实验一直线生成算法报告_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《计算机图形学 实验一直线生成算法报告》由会员分享,可在线阅读,更多相关《计算机图形学 实验一直线生成算法报告(9页珍藏版)》请在金锄头文库上搜索。

1、实验一直线生成算法1、 实验目的及要求:1学习C语言的基本绘图方法;2. 实习直线基本生成算法;3了解光栅图形显示器的工作原理和特点;4掌握课本所介绍的图形算法的原理和实现。 5. 基于光栅图形显示器,在c环境中使用基本图形生成算法画根粗细不同的直线。1.)写出完整的DDA画线算法程序,使其可以画任意直线;2.)写出完整的中点画线算法程序,使其可以画任意直线;3)写出完整的Breaenham画线程序,使其可以画任意直线;二、理论基础:1、DDA算法:实现的关键是如何步进和步进的方向:步进的正或负,决定能否正确的到达终点。步进的大小:它控制了变化最大的步进,令其为单位步进,而另一个方向的步进必小

2、于1 ,这样不论斜率|m|1否,都会使直线的亮度均匀。 依公式: 则下一点坐标为: 2、 中点画法:假设x坐标为xp的各像素点中,与直线最近者已确定,为(xp,yp)。那么,下一个与直线最近的像素只能是正右方的P1(xp+1,yp)或右上方的P2(xp+1,yp+1)两者之一。再以M表示P1与P2的中点,即M=(xp+1,yp+0.5)。又设Q是理想直线与垂直线x=xp+1的交点。若M在Q的下方,则P2离直线近,应取为下一个像素;否则应取P1。3、 Bresenham算法:假设我们需要由 (x0, y0) 这一点,绘画一直线至右下角的另一点(x1, y1),x,y分别代表其水平及垂直座标。在此

3、我们使用电脑系统常用的座标系,即x座标值沿x轴向右增长,y座标值沿y轴向下增长。因此x及y之值分别向右及向下增加,而两点之水平距离为x1 x0且垂直距离为y1-y0。由此得之,该线的斜率必定介乎于1至0之间。而此算法之目的,就是找出在x0与x1之间,第x行相对应的第y列,从而得出一像素点,使得该像素点的位置最接近原本的线。3、 算法设计与分析:1、DDA算法:(1)已知过端点P0 (x0, y0), P1(x1, y1)的直线段L :y=kx+b(2)直线斜率为 :k=(y1-y0)/(x1-x0)(3)Xi+1=Xi+*X Yi+1=Yi+*Y 其中, =1/max(|X|,|Y|) max

4、(|X|,|Y|)= |X| (|k|1) (4)|k|1时:Xi+1=Xi+(或-)1/k Yi+1=Yi+(或-)1这种方法直观,但效率太低,因为每一步需要一次浮点乘法和一次舍入运算。 2、 中点画法:(1) 输入直线的起点坐标P0(x0,y0)和终点坐标P1(x1,y1).(2) 定义直线当前点坐标x和y,定义中点偏差判别式d、直线斜率k、像素点颜色rgb(3) x= x0,y= y0计算d=0.5-k,k=( y1-y0)/(x1-x0), rgb=RGB=(0,0,255).(4) 绘制点(x,y),判断d的符号,若d0,则(x, y)更新为(x+1,y+1),d更新为d+1-k,否

5、则(x, y)更新为(x+1,y),d更新为d-k. 如果当前点x小于(x1,重复步骤(4),否则结束。3、Bresenham算法: (1)假定直线段的0=k0.5) Yi (d=y1)for(y=y0;ySetPixel(x,y,color) ; y+;elsefor(y=y0;ySetPixel(x,y,color) ; y-;dx=x1-x0;dy=y1-y0;k=dy/dx;if(fabs(k)=1)if(x0x1)y=y0;for(x=x0;xSetPixel(x,y,color) ; y=y+k;if(x0x1)y=y0;for(x=x0;x=x1;x-) pDC-SetPixel

6、(x,y,color) ;y=y-k;elseif(y0y1)x=x0;for(y=y0;ySetPixel(x,y,color) ;x=x+1/k;elsex=x0;for(y=y0;y=y1;y-) pDC-SetPixel(x,y,color) ;x=x-1/k;2、 中点画法源程序:float a,b,delta1,delta2,d,x,y;int x0,y0,x1,y1;if (sp0SetPixel(x,y,color);if(b=0)if(y0 y1)for(y=y0;y SetPixel(x0,y,color);elsefor(y=y0;y =y1;y-)pDC-SetPixe

7、l(x0,y,color);/if( 0=k &k= 1)d=2*a+b; delta1=2*a; delta2=2*a+2*b;while(x x1)if(d SetPixel(x,y,color);if (k =-1 & k =0)d=2*a-b;delta1=2*(a-b);delta2=2*a;while(x x1)if(dSetPixel(x,y,color);if(k 1)d=2*b+a;delta1=2*b;delta2=2*(a+b);while (y y1)if (dSetPixel(x,y,color);if(k y1)if(d 0)y-;d+=delta1;elsex+;

8、y-;d+=delta2;pDC-SetPixel(x,y,color);3、 Bresenham源程序:int x, y, dx, dy, zjx, zjy, e, temp, tag, i;int x0, x1, y0, y1;x0 = sp0;x1 = ep0;y0 = sp1;y1 = ep1;x = x0;y = y0;dx = abs(x1 - x0);dy = abs(y1 - y0);/ 判断x递增还是递减if (x1 x0)zjx = 1;elsezjx = -1;/ 判断y递增还是递减if (y1 y0)zjy = 1;elsezjy = -1;if(dy dx)temp

9、= dx;dx = dy;dy = temp;tag = 1; elsetag = 0;e = 2 * dy - dx;for(i=1; i SetPixel(x, y, color);if(e = 0)if(tag = 0)y = y + zjy;elsex = x + zjx;e = e - 2 * dx;if (tag = 0)x = x + zjx;elsey = y + zjy;e = e + 2 * dy;4、 运行结果:5、 实验心得及建议:在这次的图形学作业中,使我了解了图形界面的编程基础,也对VC中的MFC有了一定的了解,这会使得我能继续深入的了解VC中的其它的部分,使我了解编写图形界面也会带来乐趣。姓名班级学号实验日期指导教师实验成绩魏苗凤1001100820103025652012.3.18评语:

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号