资源描述:
《学生会部门纪律条例》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、计算机图形学实验报告班级:姓名:学号:指导教师:9教务处2010年6月实验一、一、实验题目:利用计算机编程语言绘制图形,主要实现以下内容:(1)、Bresenham算法生成斜率在0到1之间的直线(2)、中点算法生成圆(3)、中点算法生成椭圆二、系统分析与设计本实验采用C语言编程,运行环境为TurboC2.0。三、算法思想及程序实现1、中点算法生成任意斜率直线,并设置线型线宽。(1).算法思想假定直线斜率k在0~1之间(k的其它取值可以类似处理),当前象素点为(xp,yp),则下一个象素点有两种可选择点P1(xp+1,yp)
2、或P2(xp+1,yp+1)。若P1与P2的中点(xp+1,yp+0.5)称为M,Q为理想直线与x=xp+1垂线的交点。当M在Q的下方时,则取P2应为下一个象素点;当M在Q的上方时,则取P1为下一个象素点。这就是中点画线法的基本原理。下面讨论中点画线法的实现。过点(x0,y0)、(x1,y1)的直线段L的方程式为F(x,y)=ax+by+c=0,其中,a=y0-y1,b=x1-x0,c=x0y1-x1y0,欲判断中点M在Q点的上方还是下方,只要把M代入F(x,y),并判断它的符号即可。为此,我们构造判别式:d=F(M)=F
3、(xp+1,yp+0.5)=a(xp+1)+b(yp+0.5)+c当d<0时,M在L(Q点)下方,取P2为下一个象素;当d>0时,M在L(Q点)上方,取P1为下一个象素;当d=0时,选P1或P2均可,约定取P1为下一个象素;注意到d是xp,yp的线性函数,可采用增量计算,提高运算效率。若当前象素处于d³0情况,则取正右方象素P1(xp+1,yp),要判下一个象素位置,应计算d1=F(xp+2,yp+0.5)=a(xp+2)+b(yp+0.5)=d+a,增量为a。若d<0时,则取右上方象素P2(xp+1,yp+1)。要判断再
4、下一象素,则要计算d2=F(xp+2,yp+1.5)=a(xp+2)+b(yp+1.5)+c=d+a+b,增量为a+b。画线从(x0,y0)开始,d的初值d0=F(x0+1,y0+0.5)=F(x0,y0)+a+0.5b,因F(x0,y0)=0,所以d0=a+0.5b。由于我们使用的只是d的符号,而且d的增量都是整数,只是初始值包含小数。因此,我们可以用2d代替d来摆脱小数。(2)程序实现#include#include#include9voidmyfor(intx
5、,intx1,inty,intcolor,intk,intx0){for(x=x0;x<=x1;x++){circle(x,(y+0.5),color);y=y+k;}}voidDDAline(intx0,inty0,intx1,inty1,intcolor){intx,dx,dy,k,y;dx=x1-x0;dy=y1-y0;k=dy/dx;y=y0;myfor(x,x1,y,color,k,x0);}voidinput(intx0,inty0,intx1,inty1,intcolor){printf("pleaseinp
6、utx0y0x1y1color:");scanf("%d%d%d%d%d",&x0,&y0,&x1,&y1,&color);DDAline(x0,y0,x1,y1,color);getch();closegraph();}voidmain(){intx0,y0,x1,y1;intcolor;intdriver,mode;9driver=DETECT;mode=0;initgraph(&driver,&mode,"");input(x0,y0,x1,y1,color);}实验结果:2、Bresenham算法生成任意斜率直线,
7、并设置线型线宽。(1).算法思想9假设x列的的象素已经确定,其行下标为y。那么下一个象素的列坐标比为x+1,而行坐标要么不变,要么增1。是否增1取决于误差项D的值。因为直线的起始点在象素的中心,所以误差项d的初始值为0,x下标每增加1,d的值就相应递增直线的斜率。一旦d>=1,就把它减去,这样保证d始终在0和1之间。当d>0.5时,直线与x+1列垂直网络线交点最接近于当前象素的右上方象素(x+1,y);而d<0.5时,更接近于象素(x+1,y),当d=0.5时,与上述二象素一样接近,约定取(x+1,y+1)。令e=d-0.
8、5。则当e大于等于0,下一象素的y下标增加1,则当e<0时,下一象素的y下标不增。e的初始值为-0.5。(2)程序实现#include#include#includeBresenham_Line(x0,y0,x1,y1,color){inti,x