欢迎来到天天文库
浏览记录
ID:39504371
大小:3.48 MB
页数:16页
时间:2019-07-04
《计算机图形学课程设计报告1》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、[设计目的]运用DDA算法画出斜率各不同的直线,包括大于-1小于1、等于1,大于1,小于-1,无穷大。[设计思路](写出设计所参考的理论或算法步骤)已知过端点P0(x0,y0),P1(x1,y1)的直线段L:y=kx+b,直线斜率为,这种方法直观,但效率太低,因为每一步需要一次浮点乘法和一次舍入运算。计算yi+1=kxi+1+b=kxi+b+kDx=yi+kDx当Dx=1;yi+1=yi+kl即:当x每递增1,y递增k(即直线斜率);l注意上述分析的算法仅适用于
2、k
3、≤1的情形。在这种情况下,x每增加1,y最
4、多增加1。l当
5、k
6、>1时,必须把x,y地位互换[主要程序代码]voidLineDDA(intx0,inty0,intx1,inty1,intcolor){if(dx==0){x=x0;y=min(y0,y1);while(y7、);x++){putpixel((int)x,(int)(y+0.5),color);y+=m;delay(1000);}}else{y=min(y0,y1);if(y==y0)x=x0;elsex=x1;for(;y<=max(y0,y1);y++){putpixel((int)(x+0.5),(int)y,color);x+=1/m;delay(1000);}}}}[运行效果](抓图及文字说明)[设计目的]中点算法画直线的设计与实现运用中点算法画出斜率各不同的直线,包括大于-1小于1、等于1,大于1,小于8、-1,无穷大。[设计思路](写出设计所参考的理论或算法步骤)中点画线算法的原则是:如下图所示,但斜率K<1时,选定一个点之后,再计算中点M。如果M>0,这线更靠近E点,下一点选择为E点。反之选择NE点。首先:f(x,y)=ax+by+c=0,且 y=dy/dx*x+B, so:f(x,y)=dy*x-dx*y+Bdx=0so:a=dy,b=-dx,c=Bdx.假设,已经选定P点,应用中点法则选择下一点是,我们只要计算f(x+1,y+1/2),并考察是正数还是负数。我们定义d=f(x+1,y+1/2)=a(x+9、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。对于初始值,我们选择第一个端点10、为(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–dxd1=2*dyd2=2*(dy-dx)[主要程序代码]voidMidPointLine(intx0,inty0,intx1,inty1,intcolor){if(dx==0)/*k为无穷大*/{y=min(y0,y1);x=x0;while(y11、l(x,y,color);delay(1000);y++;}}elseif(dy==0)/*k==0*/{。。。。}else{k=(dy*1.0)/dx;if(k<1&&k>0)/*00){x++;d+=incrE;}el12、se{y++;x++;d+=incrNE;}putpixel(x,y,color);delay(1000);}}elseif(k>=1)/*whenk>1*/{。。。。。}elseif((k>=-1)&&(k<0))/*-1
7、);x++){putpixel((int)x,(int)(y+0.5),color);y+=m;delay(1000);}}else{y=min(y0,y1);if(y==y0)x=x0;elsex=x1;for(;y<=max(y0,y1);y++){putpixel((int)(x+0.5),(int)y,color);x+=1/m;delay(1000);}}}}[运行效果](抓图及文字说明)[设计目的]中点算法画直线的设计与实现运用中点算法画出斜率各不同的直线,包括大于-1小于1、等于1,大于1,小于
8、-1,无穷大。[设计思路](写出设计所参考的理论或算法步骤)中点画线算法的原则是:如下图所示,但斜率K<1时,选定一个点之后,再计算中点M。如果M>0,这线更靠近E点,下一点选择为E点。反之选择NE点。首先:f(x,y)=ax+by+c=0,且 y=dy/dx*x+B, so:f(x,y)=dy*x-dx*y+Bdx=0so:a=dy,b=-dx,c=Bdx.假设,已经选定P点,应用中点法则选择下一点是,我们只要计算f(x+1,y+1/2),并考察是正数还是负数。我们定义d=f(x+1,y+1/2)=a(x+
9、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。对于初始值,我们选择第一个端点
10、为(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–dxd1=2*dyd2=2*(dy-dx)[主要程序代码]voidMidPointLine(intx0,inty0,intx1,inty1,intcolor){if(dx==0)/*k为无穷大*/{y=min(y0,y1);x=x0;while(y11、l(x,y,color);delay(1000);y++;}}elseif(dy==0)/*k==0*/{。。。。}else{k=(dy*1.0)/dx;if(k<1&&k>0)/*00){x++;d+=incrE;}el12、se{y++;x++;d+=incrNE;}putpixel(x,y,color);delay(1000);}}elseif(k>=1)/*whenk>1*/{。。。。。}elseif((k>=-1)&&(k<0))/*-1
11、l(x,y,color);delay(1000);y++;}}elseif(dy==0)/*k==0*/{。。。。}else{k=(dy*1.0)/dx;if(k<1&&k>0)/*00){x++;d+=incrE;}el
12、se{y++;x++;d+=incrNE;}putpixel(x,y,color);delay(1000);}}elseif(k>=1)/*whenk>1*/{。。。。。}elseif((k>=-1)&&(k<0))/*-1
此文档下载收益归作者所有