您好,欢迎访问三七文档
数学与计算科学学院实验报告实验项目名称线的生产所属课程名称计算机图形学实验类型验证型实验日期2015—4—13班级信计12-2学号201253100212姓名黄全林成绩第1页共9页一、实验概述:【实验目的】1、理解直线生成的基本算法。如:直线DDA算法、直线Breseham等;2、掌握直线生成的基本程序实现。【实验原理】直线生的DDA算法基本原理1.直线DDA的描述设(x1,y1)和(x2,y2)分别为所求直线的起点和终点坐标,由直线的微分方程得2121yydyymdxxxx直线斜率(1)可通过计算由x方向的增量△x引起y的改变来生成直线:11iiiiixxxyyxyxm(2)也可以通过向y方向实现11iiiiiyyyxxxxym(3)通过(2)式递推就能实现直线的绘制。11iiiiiyyyxxxxym2.直线DDA算法思想选定21xx和21yy中较大者作为步进方向(假设21xx较大),取该方向上的增量为一个象素单位(△x=1),然后利用(1)式计算另一个方向的增量(△y=△x·m=m)。第2页共9页通过递推公式(2),把每次计算出的11(,)iixy经取整后送到显示器输出,则得到扫描转换后的直线。之所以取21xx和21yy中较大者作为步进方向,是考虑沿着线段分布的象素应均匀,这在下图中可看出。另外,算法实现中还应注意直线的生成方向,以决定Δx及Δy是取正值还是负值。3.直线DDA算法实现1、已知直线的两端点坐标:(x1,y1),(x2,y2);2、已知画线的颜色:color;3、计算两个方向的变化量:dx=x2-x1dy=y2-y14、求出两个方向最大变化量的绝对值:steps=max(|dx|,|dy|);5、计算两个方向的增量(考虑了生成方向):xin=dx/stepsyin=dy/steps;6、设置初始象素坐标:x=x1,y=y1;7、用循环实现直线的绘制:for(i=1;i=steps;i++);{putpixel(x,y,color);/*在(x,y)处,以color色画点*/第3页共9页x=x+xin;y=y+yin;}4.直线DDA算法演示Step1:Step2:Step3:Step**:5.直线DDA算法的特点该算法简单,实现容易,但由于在循环中涉及实型数的运算,因此生成直线的速度较慢。【实验环境】1、硬件环境第4页共9页2、软件环境二、实验内容:【实验方案】直线DDA算法的VC++程序实现根据上述算法,源程序如下:#includegraphics.h#includeconio.h//四舍五入intRound(floatx){第5页共9页return(int)(x0?x-0.5:x+0.5);}//使用DDA算法画任意斜率的直线(包括起始点,不包括终止点)voidLine_DDA(intx1,inty1,intx2,inty2,intcolor){floatx,y;//当前坐标floatcx,cy;//x、y方向上的增量intsteps=abs(x2-x1)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(inti=0;isteps;i++){putpixel(Round(x),Round(y),color);//在坐标(x,y)处画一个color颜色的点x+=cx;y+=cy;}}//主函数voidmain(){initgraph(640,480);//测试画线Line_DDA(100,1,1,478,WHITE);Line_DDA(1,478,638,1,GREEN);//待测试直线//按任意键退出第6页共9页getch();closegraph();}【实验结论】(结果)运行上述程序Step1:一条直线测试Step2:多条直线绘制第7页共9页【实验小结】(收获体会)通过本实验的,基本掌握了直线的DDA算法实现。由于DDA算法的特点,对于高速的图形显示将不能适应。因此,需要掌握其他的经典算法。三、指导教师评语及成绩:评语评语等级优良中及格不及格1.实验报告按时完成,字迹清楚,文字叙述流畅,逻辑性强2.实验方案设计合理3.实验过程(实验步骤详细,记录完整,数据合理,分析透彻)4实验结论正确.成绩:指导教师签名:批阅日期:附录1:源程序源程序#includegraphics.h#includeconio.h//四舍五入intRound(floatx){return(int)(x0?x-0.5:x+0.5);}//使用DDA算法画任意斜率的直线(包括起始点,不包括终止点)voidLine_DDA(intx1,inty1,intx2,inty2,intcolor){floatx,y;//当前坐标floatcx,cy;//x、y方向上的增量intsteps=abs(x2-x1)abs(y2-y1)?abs(x2-x1):abs(y2-y1);x=(float)x1;第8页共9页y=(float)y1;cx=(float)(x2-x1)/steps;cy=(float)(y2-y1)/steps;for(inti=0;isteps;i++){putpixel(Round(x),Round(y),color);//在坐标(x,y)处画一个color颜色的点x+=cx;y+=cy;}}//主函数voidmain(){initgraph(640,480);//测试画线Line_DDA(100,1,1,478,WHITE);Line_DDA(1,478,638,1,GREEN);//待测试直线//按任意键退出getch();closegraph();}
本文标题:DDA直线算法生成
链接地址:https://www.777doc.com/doc-2224695 .html