版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、院系:计算机科学学院专业:软件工程年级:2011 级课程名称:计算机图形学组号:37组组员:向杨辉、蒙德亮、王鸿儒指导教师:孙阳光2013年11月22日年级2011 级学号110651181106512011065124专业软件工程姓名向杨辉蒙德亮王鸿儒实验时间10.30实验地点9-206实验名称1直线的扫描转换实验类型设计型综合型创新型1. 实验内容用基本增量算法和 Brese nham算法画直线2. 实验目的)理解在显示器上画图与在纸上画图的本质区别;)掌握直线的光栅扫描转换过程;)掌握不同算法绘制直线的思路和优缺点3.7要求)将像素网格表现出来,建立网格坐标系;)用橡皮筋的形式输入参数;
2、)鼠标移动时,显示鼠标当前位置;)显示判别式的计算过程和下一点的选择策略;)记录生成点的坐标,建议用表的形式;)图形生成过程可以重复进行。4.详细设计算法原理(DDA根据直线方程y=kx+b,由两个直线的端点(xO,y)(x1y1) 可求得斜率k。可以将变量 x 设定初值为x0,y初值y0。每次x步进1,同时使y步进k,可获得表示直线的所有近似的 结果集。该方法简单,但是每次循环都要做一次乘法、一次加法并调用一次对y的取整运算,因此效率比较低。DDA算法画线(关键代码):void DDACreateL in e(GLsizei xO, GLsizei yO, GLsizei x1, GLsiz
3、ei y1, GLsizei num) /设置颜色glColor3f(0.0f,0.0f,1.0f);/对画线动画进行控制if(num = 1)prin tf("DDA画线算法:各点坐标else if(num=0)return;/画线算法的实现GLsizei dx,dy,epsl,k;GLfloat x,y,x lncre,yln cre;dx = x1-x0;dy = y1-y0;x = x0;y = y0;if(abs(dx) > abs(dy) epsl = abs(dx); else epsl = abs(dy);xlncre = (float)dx / epsl ;y
4、lncre = (float)dy / epsl ;for(k = 0; k<=epsl; k+) putpixel(int)(x+0.5), (int)(y+0.5); if (k>=num-1) prin tf("x=%f,y=%f,取(in t)(x+0.5),(i nt)(y+0.5);break;x += xln cre;y += yln cre;if(x >= 25 | y >= 25) break;n");整 后x=%d,y=%dn",x, y算法原理(Bresenham):过各行各列象素中心构造一组虚拟网格线。按直线从起点到
5、终点的顺序计算直线与各 垂直网格线的交点,然后确定该列象素中与此交点最近的象素。该算法的巧妙之处在于采 用增量计算,使得对于每一列,只要检查一个误差项的符号,就可以确定该列的所求象素。Brese nham算法画线(关键代码):void Lin e(GLsizei xO, GLsizei yO, GLsizei x1, GLsizei y1, GLsizei num)glColor3f(1.0f,0.0f,0.0f);if(num = 1)printf(”中点Bresenham算法画直线:各点坐标及判别式的值n");else if(num=0)return;/中点Bresenham划线
6、算法的实现GLsizei dx , dy, d, Upln cre, Downln cre, x, y;if (x0 > x1)x = x1; x1 = x0; x0 = x;y = y1; y1 = y0; y0 = y;x = x0; y = yO;dx = x1 - xO; dy = y1 - yO;d = dx - 2 * dy;Upl ncre=2*dx-2*dy;Dow nln cre=-2*dy;while(x<=x1)putpixel(x,y);prin tf("x = %d , y = %d n",x,y);x+;if(d<O)y+;d+
7、=Up In cre;elsed+=Dow nln cre;实 验 结 果 分 析以下为画直线的过程:年级2011 级学号110651181106512011065124专业软件工程姓名向杨辉蒙德亮王鸿儒实验时间11.6实验地点9-206实验名称2圆弧的扫描转换实验类型设计型综合型创新型1.实验内容用正负法和Brese nham算法画圆弧2.实验目的1)掌握圆及圆弧的光栅扫描转换过程;2)掌握不同算法绘制圆弧的技巧和优缺点。3.实验要求1)将像素网格表现出来,建立网格坐标系;实 验 目 的 或 要 求2)3)4)5)6)用橡皮筋的形式输入参数;鼠标移动时,显示鼠标当前位置;显示判别式的计算过程
8、和下一点的选择策略;记录生成点的坐标,建议用表的形式;图形生成过程可以重复进行。4.详细设计设要显示圆的圆心在原点(0, 0),半径为R,初始点的坐标为(0, R),顺时针生成八分之一圆,令:F(x, y)=x2+y2-R2则圆的方程为:F(x , y)=0当点(x,y)在圆内时,贝UF(x,y)<0 ;当点(x, y)在圆外时,则F(x, y)>0 ; 当点(X, y)在圆上时,则 F(x, y)=0 ;正负法:利用平面曲线将平面划分成正负区域,对当前点产生的圆函数进行符号判别,利用负反 馈调整以决定下一个点的产生来直接生成圆弧。假设当前点为 P (Xi,y),取下一个点Pi+i
9、 (x i+i,yi+i)的原则是:1、 当F(Xi, yi) <0时:取Xi+i = x i+1 , yi+i = yi。即向右走一步,从圆内走向圆外。对应 图(a)中的从P到Pi+i。2、 当F(Xi, yi)>0时:取Xi+i = Xi, yi+i=yi-1。即向下走一步,从圆外走向圆内。对应图 (b)中的从Pi到R+i。由于向圆内或向圆外走取决于 F(Xi , yi)的正负,因此称为正负法 给象素坐标(x , y)及F赋初始值后,进入循环画点;画点后,根据F的符号进行F值的递推和下一个点的获取,直到x>y为止。同前面介绍的一样,利用圆的八分对称性,循环一次,画八个点。
10、正负法画圆:void circle。nt x0,i nt y0,i nt r,i nt color)int x=O,y=r,f=O;while(x<=y)putdot(xO,yO,x,y,color);if(f<=0)f=f+2*x+1;x+;elsef=f_2*y+1;y-;Brese nham 算法:它的思想在于用误差量来衡量点选取的逼近程度。其过程如下:以平面二维图形的扫描转换为例,设要画的图形方程为 F(x, y)=0,要画的区域为xO, x (不妨设x方向是最大位移方向,即x > y),则F (x,y)也是一个误差度量函数,我们拿离散的点值代入如果大于0则正向偏离,
11、否则负向偏离,等于 0的情况比较少,它表示的是不偏离即恰好与真实点重合。既然x是最大位移方向,那每次对x自增1,相应的y可以选择不增或增1(或-1,具体问题具体分析),选择的方法就是d = F(x + 1, y ±0.5)的正负情况进行判断从而选择y的值。实际情况中还要考虑到浮点数的计算问题,因为基本的图形扫描转换算法最好能够硬件实现,所以摆脱浮点数是最好的,常用的方法是对d进行递推,而不是直接由F (x,y)给出(直接给出速度会慢)Brese nham算法画圆:void Circle(GLsizei x, GLsizei y, GLsizei R, GLsizei nu m)glC
12、olor3f(0.0f,0.0f,1.0f);if(num = 1)prin tf("Brese nham算法画圆:各点坐标及判别式的值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);putpixel(xa+x,-ya+y);if
13、 (k>=num-1) prin tf("x=%d , y=%dn" , xa+x,ya+y);break;k+;if(d<0) d+=2*xa+3;elsed+=2*(xa-ya)+5;ya-;xa+;各点坐标显示:4 J-T 4 4 4 4 3 2 2 1 2622.2 ZA2 ¥ 血y¥yyvs1yyv实 验 结 果 分 析年级2011 级学号110651181106512011065124专业软件工程姓名向杨辉蒙德亮王鸿儒实验时间11.13实验地点9-206实验名称3直线段的裁剪类验设计型综合型创新型实 验 目 的 或 要 求1. 实
14、验内容用Cohen-SutherLand算法和liang _barsky算法进行线段裁剪2. 实验目的1 )理解裁剪的相关概念2 )掌握直线段的一般裁剪过程;3 )理解并掌握 Cohe n-SutherLa nd算法的编码思想;4 )理解并掌握Liang_Barsky算法的参数化裁剪思想;3. 实验要求1 )将像素网格表现出来,建立网格坐标系;2 )用橡皮筋的形式输入剪裁线段和裁剪窗口;3 )鼠标移动时,显示鼠标当前位置;4 )对于线段裁剪,线段被窗口的四条边裁剪的过程要显示出来;5 )裁剪过程可以重复进行。4.详细设计Cohen- Sutherland 算法首先对线段的两个端点按所在的区域进
15、行分区编码,根据编码可以迅速地判明全部在窗口内的线段和全部在某边界外侧的线段。只有不属于这两种情况的线段,才需要求出线 段与窗口边界的交点,求出交点后,舍去窗外部分。对剩余部分,把它作为新的线段看待,又从头开始考虑。两遍循环之后,就能确定该 线段是部分截留下来,还是全部舍弃。1分区编码延长裁剪边框将二维平面分成九个区域,每个区域各用一个四位二进制代码标识。各区代码值如图中所示。2、判别实 验 原 理根据C1和C2的具体值,可以有三种情况:(1) C1=C2= 0,表明两端点全在窗口内,因而 整个线段也在窗内,应予保留。(2) C1&CN0 (两端点代码按位作逻辑乘不为 0),即C1和C
16、2至少有某一位同时为 1,表明两端 点必定处于某一边界的同一外侧,因而整个线段全 在窗外,应予舍弃。(3) 不属于上面两种情况,均需要求交点。1001 ; 10000001 0000D101 ! 0100;1C100C1I00110c-s®法分区编喘图3、求交点假设算法按照:左、右、下、上边界的顺序进行求交处理,对每一个边界求完交点,并相 关处理后,算法转向第 2步,重新判断,如果需要接着进入下一边界的处理。为了规范算法,令线段的端点P1为外端点,如果不是这样,就需要 P1和P2交换端点。当条件(C1 &0001M 0)成立时,表示端点P1位于窗口左边界外侧,按照前面介绍的求
17、交公式,进行对左边界的求交运算。依次类推,对位于右、下、上边界外侧的判别, 应将条件式中的0001分别改为0010> 0100、 1000即可。求出交点P后,用P仁P来舍去线段的窗外部分,并对P1重新编码得到 C1,接下来算法转回第2步继续对其它边界进行判别。Cohe n-Sutherla nd 裁剪算法:void Clip(float x0,float yO,float x1,float y1,Rect *rect,CDC *pDC) bool accept,d one;accept=FALSE;do ne=FALSE;OutCode code0,code1;OutCode *outC
18、ode;float x,y;CompOutCode(xO,yO,rect, &codeO);CompOutCode(x1,y1,rect, &code1);doif(code0.all=0&&code1.all=0)accept=TRUE;don e=TRUE;else if(code0.all&code1.all)!=0)don e=TRUE;elseif(code0.all!=0)outCode=&code0;elseoutCode=&code1;if(outCode->left) y=y0+(y1-y0)*(rect->
19、xmi n-x0)/(x1-x0); x=(float)rect->xmi n;else if(outCode->top) x=x0+(x1-x0)*(rect->ymax-y0)/(y1-y0); y=(float)rect->ymax;else if(outCode->right) y=y0+(y1-y0)*(rect->xmax-x0)/(x1-x0); x=(float)rect->xma x;else if(outCode->bottom) x=x0+(x1-x0)*(rect->ymi n-y0)/(y1-y0); y=(flo
20、at)rect->ymi n;if(outCode->all=code0.all)x0=x;y0=y;CompOutCode(xO,yO,rect, &codeO); elsex1= x;y仁y;CompOutCode(x1,y1,rect, &code1);while(!d on e);if(accept)DrawLi ne(i nt)xO,(i nt)yO,(i nt)x1,(i nt)y1,pDC,1);梁友栋-Barsky裁剪算法:一条两端点为 P1 (x1, y1 )、P2 (x2 , y2)的线段可以用参数方程形式表示:x= x1+ u ?( x2-x1
21、) = x1+ u ? xy= y1+ u ?( y2-y1 ) = y1+ u ? y0< u< 1式中, x=x2 -x1 , y=y2-y1,参数u在01之间取值,P (x, y)代表了该线段上 的一个点,其值由参数u确定,由公式可知,当 u=0时,该点为P1 (x1 , y1 ),当u=1时,该点为 P2 (x2, y2 )。梁友栋-Barsky算法只能应用于矩形窗口的情形。通常梁友栋-Barsky算法比CohenSutherland算法效率更高,因为需要计算的交点数目减少了。更新参数u1、u2仅仅需要一次除法;线段与窗口边界的交点仅计算一次,就计算出u1、u2最后的值。相
22、比之下,即使一条线段完全落在裁剪窗口之外,Cohe n Sutherla nd算法也要对它反复求交点,而且每次求交计算都需要做乘除法lia ng-Barskey 裁剪:void CTestView:LBCIip(double *x1,double *y1,double *x2,double *y2)裁剪函数double tmax,tm in, dx,dy;dx=*x2-*x1;dy=*y2-*y1;tmax=0.0,tmi n=1.0;/窗口边界的左、右、下、上顺序裁剪直线if(LBClipTest(-dx,*x1-wxl,&tmax,&tmin)/n= 1,左边界 u1 =
23、x, v1 = x1 wxlif(LBClipTest(dx,wxr-*x1,&tmax,&tmin)n= 2,右边界 u2 = A x, v2 = wxrx1if(LBClipTest(-dy,*y1-wyb,&tmax,&tmin)/n= 3,下边界 u3=A y, v3=y1-wybif(LBClipTest(dy,wyt-*y1,&tmax,&tmin)n= 4,上边界 u4 = A y,v4 = wyt-y1if(tmi n< 1.0)/判断直线的终点*x2=*x1+tmi n*dx;重新计算直线端点*y2=*yl+tmin*dy
24、;/x= x1 + t(x2 x1)格式if(tmax>0.0)判断直线的起点*x1+=tmax*dx;*y1+=tmax*dy;程序运行截图如下:将限定区域外的直线剪裁后:实 验 结 果 分 析年级2011 级学号110651181106512011065124专业软件工程姓名向阳辉蒙德亮王鸿儒实验时间11.20实验地点9-206实验名称4多边形的裁剪类验设计型综合型创新型实 验 目 的 或 要 求1. 实验内容用Sutherland-Hodgman算法进行多边形裁剪2. 实验目的1 )理解多边形裁剪与直线段裁剪的区别;2 )掌握多边形的裁剪过程;3 )理解并掌握Sutherland-
25、Hodgman算法的裁剪思想3. 实验要求1 )将像素网格表现出来,建立网格坐标系;2 )用橡皮筋的形式输入剪裁多边形和裁剪窗口;3 )鼠标移动时,显示鼠标当前位置;4 )多边形被窗口的四条边裁剪的过程以及多边形顶点增删的过程要显示出来;5 )裁剪过程可以重复进行。4.详细设计Sutherland-Hodgeman多边形裁剪算法思想:每次用窗口的一条边界(包括延长线)对要裁剪的多边形进行裁剪,裁剪时,顺序地测 试多边形各顶点,保留边界内侧的顶点,删除外侧的顶点,同时,适时地插入新的顶点: 即交点和窗口顶点,从而得到一个新的多边形顶点序列。然后以此新的顶点序列作为输入,相对第二条窗边界线进行裁剪
26、,又得到一个更新的 多边形顶点序列。依次下去,相对于第三条、第四条边界线进行裁剪,最后输出的多边形顶点序列即为 所求的裁剪好了的多边形。新的多边形顶点序列产生规则:在用窗口一条边界及其延长线裁剪一个多边形时,该边界线把平面分成两个部分:一 部分称为边界内侧;另一部分称为边界外侧。依序考虑多边形的各条边。假设当前处理的多边形的边为SP(箭头表示顺序关系,前一点,p为当前点),边SP与裁剪线的位置关系只有下面四种情况:1、S在外侧,P在内侧。则交点 Q当前点P保存到新多边形中。2、S、P均在内侧,则当前点 P保存到新多边形中。3、S在内侧,P在外侧。则交点Q保存到新多边形中。4、S、P均在外侧。则
27、没有点被保存到新多边形中。Sutherland-Hodgeman多边形裁剪实现:void CTestView:Cohe n()/Cohe n Sutherla nd 算法BOOL Cha nge;double x,y;RC0=E nCode(Poi ntx0,Poi ntyO);RC1=E nCode(Poi ntx1,Poi nty1);while(TRUE)Cha nge=FALSE; if(0 = (RC0|RC1) /简取之return;else if(0!=(RC0 & RC1)/简弃之实 验 原 理return;elseif(O=RCO) 如果P0点在窗口内,交换 P0和P1,保证p0点在窗口外/交换点的坐标值double TPoi ntx,TPoi nty;TPoi ntx=Poi ntx0;TPoi nty=Poi ntyO;Poi ntx0=Poi ntx1;Poi nty0=Poi nty1;Poi ntx1=TPoi ntx;Poi nty1=TPoi nty;/交换点的编码值un sig ned int TRC;TRC=RC0;RC0=RC1;RC1=TRC;/按左、右、下、上的顺序裁剪if(RC0 & LEFT
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年商标产品授权协议
- 2025版智能机器人销售与服务民事诉状合同4篇
- 2025年仓储租赁协议价格公示
- 2025年图书发行销售宣传推广渠道协议书
- 二零二五年度离婚协议书样本:感情破裂离婚协议及子女抚养问题处理6篇
- 二零二五年度附期限与股权激励相结合的股权转让协议3篇
- 二零二五年度装饰材料研发创新与市场推广合作协议3篇
- 2025年水稻种植技术培训与推广合同3篇
- 2025版绿城物业社区图书馆管理服务协议3篇
- 二零二五版企事业单位保安人员劳务派遣服务协议3篇
- 专题12 工艺流程综合题- 三年(2022-2024)高考化学真题分类汇编(全国版)
- DB32T-经成人中心静脉通路装置采血技术规范
- 【高空抛物侵权责任规定存在的问题及优化建议7100字(论文)】
- TDALN 033-2024 学生饮用奶安全规范入校管理标准
- 物流无人机垂直起降场选址与建设规范
- 冷库存储合同协议书范本
- AQ/T 4131-2023 烟花爆竹重大危险源辨识(正式版)
- 武术体育运动文案范文
- 设计服务合同范本百度网盘
- 2024年市级专科护士理论考核试题及答案
- 肺炎临床路径
评论
0/150
提交评论