




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、院 系: 计算机科学学院 专 业: 软件工程 年 级: 2011 级 课程名称: 计算机图形学 组 号: 37组 组 员: 向杨辉、蒙德亮、王鸿儒 指导教师: 孙阳光 2013年11月22日年级2011级学号 110651181106512011065124专业软件工程姓名 向杨辉蒙德亮王鸿儒实验时间10.30实验地点9-206实验名称1 直线的扫描转换实验类型设计型综合型创新型实验目的或要求1. 实验内容 用基本增量算法和Bresenham算法画直线2实验目的 1)理解在显示器上画图与在纸上画图的本质区别; 2)掌握直线的光栅扫描转换过程; 3)掌握不同算法绘制直线的思路和优缺点3. 实验要
2、求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入参数; 3)鼠标移动时,显示鼠标当前位置; 4)显示判别式的计算过程和下一点的选择策略; 5)记录生成点的坐标,建议用表的形式; 6)图形生成过程可以重复进行。4.详细设计算法原理(DDA) 根据直线方程y=kx+b,由两个直线的端点(x0,y)(x1y1)可求得斜率k。可以将变量x设定初值为x0,y初值y0。每次x步进1,同时使y步进k,可获得表示直线的所有近似的结果集。该方法简单,但是每次循环都要做一次乘法、一次加法并调用一次对y的取整运算,因此效率比较低。实验原理 DDA算法画线(关键代码):voi
3、d DDACreateLine(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)/设置颜色glColor3f(0.0f,0.0f,1.0f);/对画线动画进行控制if(num = 1)printf("DDA画线算法:各点坐标n");else if(num=0)return;/画线算法的实现GLsizei dx,dy,epsl,k;GLfloat x,y,xIncre,yIncre;dx = x1-x0;dy = y1-y0;x = x0;y = y0;if(abs(dx) > abs(dy) ep
4、sl = abs(dx);else epsl = abs(dy);xIncre = (float)dx / epsl ;yIncre = (float)dy / epsl ;for(k = 0; k<=epsl; k+)putpixel(int)(x+0.5), (int)(y+0.5);if (k>=num-1) printf("x=%f,y=%f,取整后x=%d,y=%dn", x, y, (int)(x+0.5),(int)(y+0.5);break;x += xIncre;y += yIncre;if(x >= 25 | y >= 25) b
5、reak;算法原理(Bresenham):过各行各列象素中心构造一组虚拟网格线。按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列象素中与此交点最近的象素。该算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求象素。Bresenham算法画线(关键代码):void Line(GLsizei x0, GLsizei y0, GLsizei x1, GLsizei y1, GLsizei num)glColor3f(1.0f,0.0f,0.0f);if(num = 1)printf("中点Bresenham算法画直线:各点坐标及判
6、别式的值n");else if(num=0)return;/中点Bresenham划线算法的实现GLsizei dx , dy, d, UpIncre, DownIncre, x, y;if (x0 > x1)x = x1; x1 = x0; x0 = x;y = y1; y1 = y0; y0 = y;x = x0; y = y0;dx = x1 - x0; dy = y1 - y0;d = dx - 2 * dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;while(x<=x1)putpixel(x,y);printf("x = %
7、d , y = %d n",x,y);x+;if(d<0)y+;d+=UpIncre;elsed+=DownIncre;实验结果分析以下为画直线的过程:显示各点坐标值: 年级2011级学号110651181106512011065124专业软件工程姓名向杨辉蒙德亮王鸿儒实验时间11.6实验地点9-206实验名称2 圆弧的扫描转换实验类型设计型综合型创新型实验目的或要求1. 实验内容 用正负法和Bresenham算法画圆弧2实验目的 1)掌握圆及圆弧的光栅扫描转换过程; 2)掌握不同算法绘制圆弧的技巧和优缺点。3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋
8、的形式输入参数; 3)鼠标移动时,显示鼠标当前位置; 4)显示判别式的计算过程和下一点的选择策略; 5)记录生成点的坐标,建议用表的形式; 6)图形生成过程可以重复进行。4.详细设计设要显示圆的圆心在原点(0,0),半径为R,初始点的坐标为(0,R),顺时针生成八分之一圆,令:F(x,y)=x2+y2-R2则圆的方程为:F(x,y)=0当点(x,y)在圆内时,则F(x,y)<0;当点(x,y)在圆外时,则F(x,y)>0;实验原理当点(x,y)在圆上时,则F(x,y)=0;正负法:利用平面曲线将平面划分成正负区域,对当前点产生的圆函数进行符号判别,利用负反馈调整以决定下一个点的产生
9、来直接生成圆弧。假设当前点为Pi(xi,yi),取下一个点Pi+1(xi+1,yi+1)的原则是: 1、当F(xi,yi)0时:取xi+1= xi+1,yi+1= yi。即向右走一步,从圆内走向圆外。对应图(a)中的从Pi到Pi+1。2、当F(xi,yi)>0时:取xi+1= xi,yi+1= yi-1。即向下走一步,从圆外走向圆内。对应图(b)中的从Pi到Pi+1。由于向圆内或向圆外走取决于F(xi,yi)的正负,因此称为正负法给象素坐标(x,y)及F赋初始值后,进入循环画点;画点后,根据F的符号进行F值的递推和下一个点的获取,直到x>y为止。同前面介绍的一样,利用圆的八分对称性
10、,循环一次,画八个点。正负法画圆:void circle(int x0,int y0,int r,int color)int x=0,y=r,f=0;while(x<=y)putdot(x0,y0,x,y,color);if(f<=0)f=f+2*x+1;x+;elsef=f-2*y+1;y-;Bresenham算法:它的思想在于用误差量来衡量点选取的逼近程度。其过程如下:以平面二维图形的扫描转换为例,设要画的图形方程为F(x, y)=0,要画的区域为x0, x(不妨设x方向是最大位移方向,即x > y),则(x,y) 也是一个误差度量函数,我们拿离散的点
11、值代入如果大于0则正向偏离,否则负向偏离,等于0的情况比较少,它表示的是不偏离即恰好与真实点重合。既然x是最大位移方向,那每次对x自增1,相应的y可以选择不增或增1(或-1,具体问题具体分析),选择的方法就是d = F(x + 1, y ± 0.5)的正负情况进行判断从而选择y的值。实际情况中还要考虑到浮点数的计算问题,因为基本的图形扫描转换算法最好能够硬件实现,所以摆脱浮点数是最好的,常用的方法是对d进行递推,而不是直接由(x,y)给出(直接给出速度会慢)Bresenham算法画圆:void Circle(GLsizei x, GLsizei y, GLsize
12、i R, GLsizei num)glColor3f(0.0f,0.0f,1.0f);if(num = 1)printf("Bresenham算法画圆:各点坐标及判别式的值n");int d,k=0,xa,ya;xa=0;ya=R;d=1-R;while(xa<=ya) putpixel(xa+x,ya+y); putpixel(ya+x,xa+y);putpixel(-ya+x,xa+y);putpixel(-xa+x,ya+y);putpixel(-xa+x,-ya+y);putpixel(-ya+x,-xa+y);putpixel(ya+x,-xa+y);put
13、pixel(xa+x,-ya+y);if (k>=num-1) printf("x=%d , y=%dn" , xa+x,ya+y);break;k+;if(d<0) d+=2*xa+3;elsed+=2*(xa-ya)+5;ya-;xa+;实验结果分析显示所作图形:各点坐标显示:年级2011级学号110651181106512011065124专业软件工程姓名向杨辉蒙德亮王鸿儒实验时间11.13实验地点9-206实验名称3 直线段的裁剪实验类型设计型综合型创新型实验目的或要求1. 实验内容 用Cohen-SutherLand算法和liang _barsky算法
14、进行线段裁剪2实验目的 1)理解裁剪的相关概念 2)掌握直线段的一般裁剪过程; 3)理解并掌握Cohen-SutherLand 算法的编码思想; 4)理解并掌握Liang_Barsky算法的参数化裁剪思想;3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入剪裁线段和裁剪窗口; 3)鼠标移动时,显示鼠标当前位置; 4)对于线段裁剪,线段被窗口的四条边裁剪的过程要显示出来; 5)裁剪过程可以重复进行。 实验原理4.详细设计CohenSutherland算法首先对线段的两个端点按所在的区域进行分区编码,根据编码可以迅速地判明全部在窗口内的线段和全部在某边界外侧的线段。只
15、有不属于这两种情况的线段,才需要求出线段与窗口边界的交点,求出交点后,舍去窗外部分。对剩余部分,把它作为新的线段看待,又从头开始考虑。两遍循环之后,就能确定该线段是部分截留下来,还是全部舍弃。1、分区编码延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。各区代码值如图中所示。2、判别根据C1和C2的具体值,可以有三种情况:(1)C1=C20,表明两端点全在窗口内,因而整个线段也在窗内,应予保留。(2)C1&C20(两端点代码按位作逻辑乘不为0),即C1和C2至少有某一位同时为1,表明两端点必定处于某一边界的同一外侧,因而整个线段全在窗外,应予舍弃。(3)不属于上面
16、两种情况,均需要求交点。3、求交点假设算法按照:左、右、下、上边界的顺序进行求交处理,对每一个边界求完交点,并相关处理后,算法转向第2步,重新判断,如果需要接着进入下一边界的处理。为了规范算法,令线段的端点P1为外端点,如果不是这样,就需要P1和P2交换端点。当条件(C1&00010)成立时,表示端点P1位于窗口左边界外侧,按照前面介绍的求交公式,进行对左边界的求交运算。依次类推,对位于右、下、上边界外侧的判别,应将条件式中的0001分别改为0010、0100、1000即可。求出交点P后,用P1=P来舍去线段的窗外部分,并对P1重新编码得到C1,接下来算法转回第2步继续对其它边界进行判
17、别。 Cohen-Sutherland裁剪算法:void Clip(float x0,float y0,float x1,float y1,Rect *rect,CDC *pDC)bool accept,done;accept=FALSE;done=FALSE;OutCode code0,code1;OutCode *outCode;float x,y;CompOutCode(x0,y0,rect,&code0);CompOutCode(x1,y1,rect,&code1);doif(code0.all=0&&code1.all=0) accept=T
18、RUE;done=TRUE;else if(code0.all&code1.all)!=0)done=TRUE;elseif(code0.all!=0)outCode=&code0;elseoutCode=&code1;if(outCode->left)y=y0+(y1-y0)*(rect->xmin-x0)/(x1-x0);x=(float)rect->xmin;else if(outCode->top)x=x0+(x1-x0)*(rect->ymax-y0)/(y1-y0);y=(float)rect->ymax;else if(
19、outCode->right)y=y0+(y1-y0)*(rect->xmax-x0)/(x1-x0);x=(float)rect->xmax;else if(outCode->bottom)x=x0+(x1-x0)*(rect->ymin-y0)/(y1-y0);y=(float)rect->ymin;if(outCode->all=code0.all)x0=x;y0=y;CompOutCode(x0,y0,rect,&code0); elsex1=x;y1=y;CompOutCode(x1,y1,rect,&code1);while
20、(!done);if(accept)DrawLine(int)x0,(int)y0,(int)x1,(int)y1,pDC,1);梁友栋-Barsky裁剪算法:一条两端点为P1(x1,y1)、P2(x2,y2)的线段可以用参数方程形式表示:x= x1+ u(x2-x1)= x1+ uxy= y1+ u(y2-y1)= y1+ uy0u1式中,x=x2-x1,y=y2-y1,参数u在01之间取值,P(x,y)代表了该线段上的一个点,其值由参数u确定,由公式可知,当u=0时,该点为P1(x1,y1),当u=1时,该点为P2(x2,y2)。 梁友栋-Barsky算法只能应用于矩形窗口的情形。通常梁友
21、栋-Barsky算法比CohenSutherland算法效率更高,因为需要计算的交点数目减少了。更新参数u1、u2仅仅需要一次除法;线段与窗口边界的交点仅计算一次,就计算出u1、u2最后的值。相比之下,即使一条线段完全落在裁剪窗口之外,CohenSutherland算法也要对它反复求交点,而且每次求交计算都需要做乘除法liang-Barskey裁剪:void CTestView:LBClip(double *x1,double *y1,double *x2,double *y2)/裁剪函数double tmax,tmin,dx,dy;dx=*x2-*x1;dy=*y2-*y1;tmax=0.0
22、,tmin=1.0;/窗口边界的左、右、下、上顺序裁剪直线if(LBClipTest(-dx,*x1-wxl,&tmax,&tmin)/n1,左边界u1x,v1x1wxlif(LBClipTest(dx,wxr-*x1,&tmax,&tmin)/n2,右边界u2x,v2wxrx1if(LBClipTest(-dy,*y1-wyb,&tmax,&tmin)/n3,下边界u3y,v3y1-wybif(LBClipTest(dy,wyt-*y1,&tmax,&tmin)/n4,上边界u4y,v4wyt-y1if(tmin<1.0)
23、/判断直线的终点*x2=*x1+tmin*dx;/重新计算直线端点*y2=*y1+tmin*dy;/xx1t(x2x1)格式if(tmax>0.0)/判断直线的起点*x1+=tmax*dx;*y1+=tmax*dy;实验结果分析程序运行截图如下:将限定区域外的直线剪裁后:年级2011级学号110651181106512011065124专业软件工程姓名向阳辉蒙德亮王鸿儒实验时间11.20实验地点9-206实验名称4 多边形的裁剪实验类型设计型综合型创新型实验目的或要求1. 实验内容 用Sutherland-Hodgman算法进行多边形裁剪2实验目的 1)理解多边形裁剪与直线段裁剪的区别;
24、 2)掌握多边形的裁剪过程; 3)理解并掌握Sutherland-Hodgman算法的裁剪思想3. 实验要求 1)将像素网格表现出来,建立网格坐标系; 2)用橡皮筋的形式输入剪裁多边形和裁剪窗口; 3)鼠标移动时,显示鼠标当前位置; 4)多边形被窗口的四条边裁剪的过程以及多边形顶点增删的过程要显示出来; 5)裁剪过程可以重复进行。 实验原理4.详细设计Sutherland-Hodgeman多边形裁剪算法思想:每次用窗口的一条边界(包括延长线)对要裁剪的多边形进行裁剪,裁剪时,顺序地测试多边形各顶点,保留边界内侧的顶点,删除外侧的顶点,同时,适时地插入新的顶点:即交点和窗口顶点,从而得到一个新的
25、多边形顶点序列。然后以此新的顶点序列作为输入,相对第二条窗边界线进行裁剪,又得到一个更新的多边形顶点序列。依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边形顶点序列即为所求的裁剪好了的多边形。新的多边形顶点序列产生规则:在用窗口一条边界及其延长线裁剪一个多边形时,该边界线把平面分成两个部分:一部分称为边界内侧;另一部分称为边界外侧。依序考虑多边形的各条边。假设当前处理的多边形的边为SP(箭头表示顺序关系,S为前一点,P为当前点),边SP与裁剪线的位置关系只有下面四种情况:1、S在外侧,P在内侧。则交点Q、当前点P保存到新多边形中。2、S、P均在内侧,则当前点P保存到新多边形中。3、
26、S在内侧,P在外侧。则交点Q保存到新多边形中。4、S、P均在外侧。则没有点被保存到新多边形中。Sutherland-Hodgeman多边形裁剪实现:void CTestView:Cohen()/CohenSutherland算法BOOL Change;double x,y;RC0=EnCode(Pointx0,Pointy0);RC1=EnCode(Pointx1,Pointy1);while(TRUE)Change=FALSE;if(0 = (RC0|RC1)/简取之return;else if(0!=(RC0 & RC1)/简弃之return;elseif(0=RC0)/如果P0点在窗口内,交换P0和P1,保证p0点在窗口外/交换点的坐标值double TPointx,TPointy;TPointx=Pointx0;TPointy=Pointy0;Pointx0=Pointx1;Pointy0=Pointy1;Pointx1=TPointx;Pointy1=TPointy;/交换点的编码值unsigned int TRC;TRC=RC0;RC0=RC1;RC1=TRC;/按左、右、下、上的顺序裁剪if(RC0 & LEFT )/P0点
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 《西游记》整本书阅读交流教学设计、阅读单
- 二零二五版全新信用卡服务合同
- 跨境电商代理合同范例二零二五年
- 二零二五版教育聘用合同书
- 二零二五船舶船员劳务合同
- 25年公司项目部管理人员安全培训考试试题及完整答案(夺冠系列)
- 社会企业发展项目造价咨询合同
- 2025-2030中国VR体感设备行业市场发展趋势与前景展望战略研究报告
- 2025-2030中国Rootkit扫描仪行业市场现状供需分析及投资评估规划分析研究报告
- 2025-2030中国NN-二乙基乙醇胺(CAS 100-37-8)行业市场发展趋势与前景展望战略研究报告
- 初中八年级音乐-跳月歌
- 【蜜雪冰城的核心竞争力分析10000字】
- 延迟容忍网络(DTN)路由机制
- 【企业精益生产分析国内外文献综述3000字】
- 线性光耦隔离检测电压电路
- 材料封样清单土建安装
- XXX中学“生本课堂”实施方案
- 2023年河北省中考数学试卷
- 守株待兔儿童故事绘本PPT
- 医药代表客户、市场潜力分析课件
- 幼儿园大班综合《我们和手机》课件
评论
0/150
提交评论