版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Exp - University实 验 报 告课程名称 计算机图形学实验 实验项目 直线段的扫描转换 专业班级 姓 名 Exp 学 号 QQ:289065406 指导教师 成 绩 日 期 2 一、实验目的1、通过实验,进一步理解直线段扫描转换的DDA算法、中点bresenham算法以及改进bresenham算法的基本原理;2、 掌握以上算法生成直线段的基本过程;3、 通过编程,会在C/C+环境下完成用DDA算法、中点bresenham算法及bresenham算法对任意直线段的扫描转换。二、实验设备及实验环境1、计算机(每人一台)2、VC+6.0或其他C/C+语言程序设计环境三、实验学时2学时四
2、、实验内容用DDA算法中点bresenham算法及bresenham算法实现任意给定两点的直线段的绘制(直线宽度和线型可自定)。注:1、实验报告的内容: 一、实验目的;二、实验原理;三、实验步骤;四、实验结果;五、讨论分析(完成指定的思考题和作业题);六、改进实验建议。 2、各专业可在满足学校对实验教学基本要求的前提下,根据专业特点自行设计实验报告的格式,所设计的实验报告在使用前需交实践教学管理科备案。五、实验步骤1、复习有关直线扫描转换算法的基本原理,明确实验目的和要求; 2、依据算法思想,绘制程序流程图;3、设计程序界面,要求操作方便;4、用C/C+语言编写源程序并调试、执行;5、分析实验
3、结果6、对程序设计过程中出现的问题进行分析与总结;7、打印源程序或把源程序以文件的形式提交;8、按格式要求完成实验报告。六、实验报告要求:1、各种算法的基本原理;2、各算法的流程图3、实验结果及分析(比较三种算法的特点,界面插图并注明实验条件)4、实验总结(含问题分析及解决方法)七、实验原理1、DDA算法(数值微分法)数值微分法(DDA法,Digital Differential Analyzer)是一种直接从直线的微分方程生成直线的方法。给定直线的两端点P0(x0, y0)和P1(x1, y1),得到直线的微分方程如下:DDA算法原理:由于直线的一阶导数是连续的,而且对于x和y是成正比的,故
4、此可以通过在当前位置上分别加上二个小增量来求下一点的x,y坐标,如下图所示。则有:其中,=1/max(|x|,|y|)分两种情况讨论如下:(1) max(|x|,|y|)=|x|,即|k|1的情况:(2) max(|x|,|y|)=|y|,此时|k|1:注意:由于在光栅化的过程中不可能绘制半个像素点,因此对求出的xi+1,yi+1的值需要四舍五入。2、中点Bresenham算法给定直线的两个端点坐标,可以得到直线的方程为: 此时直线将平面分成三个区域:对于直线上的点,F(x, y)=0;对于直线上方的点,F(x, y)>0;对于直线下方的点,F(x,
5、y)<0,如下图所示。图52 直线将平面分为三个区域 基本原理:根据直线的斜率确定或选择变量在x或y方向上每次 递增一个单位,而另一方向的增量为1或0,它取决于实际直线与 相邻像素点的距离,这一距离称为误差项。 如下图所示,假定0k1,x是最大位移方向。算法每次在x方向上 加1,y方向上加0或加1。设当前点是P(xi, yi),则下一个点在Pu(xi+1, yi+1) 和Pd(xi+1, yi)中选一。以M点表示Pu与Pd的中点,又设Q点是理想直线与 垂线x=xi+1的交点,根据Q点与M点的位置判断选取哪一个点。 图
6、53 Brensemham算法生成直线的原理构造判别式如下: 当d<0时,M在Q点下方,Pu距离Q点近,取Pu点; 若d>0,M在Q点上方,Pd距离Q点近,取Pd点; 若d=0,M与Q点重合,Pu和Pd都合适,约定取Pd。故有:误差项递推:(1) 当d<0时,下一个候选点为(xi+1, yi+1),再下两个候选点为(xi+2, yi+1)和(xi+2, yi+2),他们的中点为(xi+2, yi+1.5),故有:此时,d的增量为1k。(2) 当d>0时,下一个候选点
7、为(xi+1, yi),再下两个候选点为(xi+2, yi)和(xi+2, yi+1),他们的中点为 (xi+2, yi+0.5),故有:此时,d的增量为k。 初始值d的计算:但此时算法中仍然包含了浮点数运算,由于这里我们仅使用了判别式d的符号,所以可以用2dx代替d来摆脱小数。用2dx代替d ,令D2dx 则:3、改进Bresenham算法基本原理:假定直线段的0k1,如下图所示,过各行、各列像素中心构造一组虚拟网格线,按直线起点到终点的顺序 计算直线与各垂直网格线的交点,交点与网格线的误差值为d。 当d>0.5时,直线更接近于像素点(x+
8、1, y+1),当d<0.5时,更接近于 (x+1,y);当d=0.5时,约定取(x+1, y)。 图5-4 改进的Brensemham算法绘制直线的原理误差项d的初始值为0,每走一步有d=d+k,一旦y方向上走了一步,就要把d减去1。即有:改进1:令e=d0.5改进2:用E=2ex来替换e八、算法流程1、DDA算法(数值微分法)适用于任意斜率的直线2、中点Bresenham算法以下算法流程仅适用于斜率为0<k<1的直线对于斜率为 k>1的直线,只需交换x、y的地位即可。对于负斜率(包括 -1<k<0和k< -1),只需把对应的正斜率的扫描算法修正为“
9、一个坐标递减而另一个坐标递增”即可。而对于水平、垂直、和k=±1的直线,无需使用扫描算法,直接绘制即可。3、改进Bresenham算法以下算法流程仅适用于斜率为0<k<1的直线对于斜率为 k>1的直线,只需交换x、y的地位即可。对于负斜率(包括 -1<k<0和k< -1),只需把对应的正斜率的扫描算法修正为“一个坐标递减而另一个坐标递增”即可。而对于水平、垂直、和k=±1的直线,无需使用扫描算法,直接绘制即可。九、实验结果及分析 以下实验窗口所显示的直线为随机生成两端点后再绘制,并非通过鼠标点击输入端点。1、DDA扫描算法绘制效果由于描点
10、较密集,通过拉伸窗体放大后可清晰看到“粒子”的效果:DDA算法的核心代码为:void DDALine(int StrX,int StrY,int EndX,int EndY) int dx=EndX-StrX;int dy=EndY-StrY;double x=(double)StrX;double y=(double)StrY;int epsl=max(abs(dx),abs(dy);double xIncre=(double)dx/(double)epsl;double yIncre=(double)dy/(double)epsl;/*描点*/ glBegin(GL_POINTS);for
11、(int k=0;k<=epsl;k+) /原形:putpixel(int)(x+0.5),(int)(y+0.5),color);glVertex2i(int)(x+0.5),(int)(y+0.5);x+=xIncre;y+=yIncre;glEnd();return;通过按B键可改变绘制的像素点的半径,从而改变线粗。这部分功能主要利用OpenGL函数glPointSize()实现。显示效果如下(图片已放大)加粗像素点后,可明显地看到直线的锯齿效果:通过在OpenGL窗口上点击右键,会弹出菜单,选择对应的项可重新选择算法绘制同一条直线,用不同的颜色标识。菜单效果如下:创建菜单的主要代
12、码如下:void Menu(void)int MainMenu=glutCreateMenu(ProcessMenu); /创建主菜单glutAddMenuEntry("DDA(数值微分)算法扫描直线",1);glutAddMenuEntry("中点Bresenham算法扫描直线",2);glutAddMenuEntry("改进Bresenham算法扫描直线",3);glutAttachMenu(GLUT_RIGHT_BUTTON);/将主菜单与鼠标右键关联return;2、中点Bresenham算法绘制效果 通过菜单切换,可直接得到
13、用中点Bresenham算法绘制同一条直线,绘制效果如下:中点Bresenham算法的核心代码为:void Mid_Bresenham(int StrX,int StrY,int EndX,int EndY) int k;int detaX=EndX-StrX;int detaY=EndY-StrY;int sign=detaX*detaY;if(StrX=EndX)/直线垂直于x轴,斜率不存在k=-10;else if(StrY=EndY)/直线垂直于y轴,斜率k=0k=0;else if(detaX=detaY)/y=x,k=1k=1;else if(detaX=-detaY)/y=-x,
14、k=-1k=-1;else if(sign>0 && abs(detaY)>abs(detaX)/k>1k=2;else if(sign>0 && abs(detaY)<abs(detaX)/0<k<1k=3;else if(sign<0 && abs(detaY)>abs(detaX)/k<-1k=-2;else if(sign<0 && abs(detaY)<abs(detaX)/-1<k<0k=-3;switch(k)case -10:/斜率
15、不存在if(StrY>EndY)Swap(StrX,EndX);Swap(StrY,EndY);for(int y=StrY;y<=EndY;y+)glBegin(GL_POINTS);glVertex2i(StrX,y);glEnd();break;case 0:/k=0if(StrX>EndX)Swap(StrX,EndX);Swap(StrY,EndY);for(int x=StrX;x<=EndX;x+)glBegin(GL_POINTS);glVertex2i(x,StrY);glEnd();break;case 1:/k=1if(StrX>EndX)S
16、wap(StrX,EndX);Swap(StrY,EndY);for(int x=StrX,y=StrY;x<=EndX;x+,y+)glBegin(GL_POINTS);glVertex2i(x,y);glEnd();break;case -1:/k=-1if(StrX>EndX)Swap(StrX,EndX);Swap(StrY,EndY);for(int x=StrX,y=StrY;x<=EndX;x+,y-)glBegin(GL_POINTS);glVertex2i(x,y);glEnd();break;case 2:/k>1if(StrY>EndY)Sw
17、ap(StrX,EndX);Swap(StrY,EndY);int dx=EndX-StrX;int dy=EndY-StrY;int x=StrX;int y=StrY;int d=2*dx-dy;int LeftIncre=2*dx;int RightIncre=2*dx-2*dy;while(y<=EndY) glBegin(GL_POINTS);glVertex2i(x,y);glEnd();y+;if(d>=0)x+;d+=RightIncre;elsed+=LeftIncre;break;case 3:/0<k<1if(StrX>EndX)Swap(S
18、trX,EndX);Swap(StrY,EndY);int dx=EndX-StrX;int dy=EndY-StrY;int x=StrX;int y=StrY;int d=dx-2*dy;int UpIncre=2*dx-2*dy;int DownIncre=-2*dy;while(x<=EndX) glBegin(GL_POINTS);glVertex2i(x,y);glEnd();x+;if(d<0)y+;d+=UpIncre;elsed+=DownIncre;break;case -2:/k<-1if(StrY<EndY)Swap(StrX,EndX);Swa
19、p(StrY,EndY);int dx=EndX-StrX;int dy=EndY-StrY;int x=StrX;int y=StrY;int d=-2*dx;int LeftIncre=-2*dx;int RightIncre=-2*dy-2*dx;while(y>=EndY) glBegin(GL_POINTS);glVertex2i(x,y);glEnd();y-;if(d<0)x+;d+=RightIncre;elsed+=LeftIncre;break;case -3:/-1<k<0if(StrX>EndX)Swap(StrX,EndX);Swap(S
20、trY,EndY);int dx=EndX-StrX;int dy=EndY-StrY;int x=StrX;int y=StrY;int d=-dx-2*dy;int UpIncre=-2*dy;int DownIncre=-2*dx-2*dy;while(x<=EndX) glBegin(GL_POINTS);glVertex2i(x,y);glEnd(); x+;if(d>=0)y-;d+=DownIncre;elsed+=UpIncre;break;return;3、改进Bresenham算法绘制效果 通过菜单切换,可直接得到用改进Bresenham算法绘制同一条直线,绘制
21、效果如下:改进Bresenham算法的核心代码为:void Imp_Bresenham(int StrX,int StrY,int EndX,int EndY) int k;int detaX=EndX-StrX;int detaY=EndY-StrY;int sign=detaX*detaY;if(StrX=EndX)/直线垂直于x轴,斜率不存在k=-10;else if(StrY=EndY)/直线垂直于y轴,斜率k=0k=0;else if(detaX=detaY)/y=x,k=1k=1;else if(detaX=-detaY)/y=-x,k=-1k=-1;else if(sign>
22、;0 && abs(detaY)>abs(detaX)/k>1k=2;else if(sign>0 && abs(detaY)<abs(detaX)/0<k<1k=3;else if(sign<0 && abs(detaY)>abs(detaX)/k<-1k=-2;else if(sign<0 && abs(detaY)<abs(detaX)/-1<k<0k=-3;switch(k)case -10:/斜率不存在if(StrY>EndY)Swap(
23、StrX,EndX);Swap(StrY,EndY);for(int y=StrY;y<=EndY;y+)glBegin(GL_POINTS);glVertex2i(StrX,y);glEnd();break;case 0:/k=0if(StrX>EndX)Swap(StrX,EndX);Swap(StrY,EndY);for(int x=StrX;x<=EndX;x+)glBegin(GL_POINTS);glVertex2i(x,StrY);glEnd();break;case 1:/k=1if(StrX>EndX)Swap(StrX,EndX);Swap(StrY
24、,EndY);for(int x=StrX,y=StrY;x<=EndX;x+,y+)glBegin(GL_POINTS);glVertex2i(x,y);glEnd();break;case -1:/k=-1if(StrX>EndX)Swap(StrX,EndX);Swap(StrY,EndY);for(int x=StrX,y=StrY;x<=EndX;x+,y-)glBegin(GL_POINTS);glVertex2i(x,y);glEnd();break;case 2:/k>1if(StrY>EndY)Swap(StrX,EndX);Swap(StrY,
25、EndY);int dx=EndX-StrX;int dy=EndY-StrY;int e=-dy;int x=StrX;int y=StrY;while(y<=EndY)glBegin(GL_POINTS);glVertex2i(x,y);glEnd();y+;e+=2*dx;if(e>0)x+;e-=2*dy;break;case 3:/0<k<1if(StrX>EndX)Swap(StrX,EndX);Swap(StrY,EndY);int dx=EndX-StrX;int dy=EndY-StrY;int e=-dx;int x=StrX;int y=St
26、rY;while(x<=EndX)glBegin(GL_POINTS);glVertex2i(x,y);glEnd();x+;e+=2*dy;if(e>0)y+;e-=2*dx;break;case -2:/k<-1if(StrY<EndY)Swap(StrX,EndX);Swap(StrY,EndY);int dx=EndX-StrX;int dy=EndY-StrY;int e=dy;int x=StrX;int y=StrY;while(y>=EndY)glBegin(GL_POINTS);glVertex2i(x,y);glEnd();y-;e+=2*dx
27、;if(e>0)x+;e+=2*dy;break;case -3:/-1<k<0if(StrX>EndX)Swap(StrX,EndX);Swap(StrY,EndY);int dx=EndX-StrX;int dy=EndY-StrY;int e=dx;int x=StrX;int y=StrY;while(x<=EndX)glBegin(GL_POINTS);glVertex2i(x,y);glEnd();x+;e+=2*dy;if(e<0)y-;e+=2*dx;break;return;4、直线重绘效果 按R键可实现该功能,主要通过srand()和rand()函数利用time(0)生成随机的直线端点坐标进行直线的重新绘制。5、分析讨论 DDA直线扫描算法是一个增量算法,原理最为简单,直观且易于实现代码编写,适用于各种斜率的直
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心情驿站:情绪健康管理平台
- 坚果的营养价值
- 2025年洗碗清洁剂项目提案报告
- 猩红热常见症状分析及护理方法
- 营养麦片美术课件
- 骨折运动疗法及功能锻炼
- 肠道外营养制度培训
- 自我教育完善个性
- 作物营养元素过剩
- 老年医学健康宣教核心要点
- 私人家政合同协议书
- 医院导诊礼仪培训案例
- 压力管理与情绪调节:护士心理健康维护
- 2025上海对外经贸大学武装部干事招聘1人参考题库附答案
- 宜宾市叙州区事业单位2025年下半年公开考核招聘工作人员(24人)笔试考试备考题库及答案解析
- 家具厂代工合同范本
- 2025台州玉环市国有企业招聘12人笔试考试参考题库及答案解析
- 运动安全急救课件
- 高层民用建筑消防安全管理规定课件
- 年货展会活动方案策划
- 2025年(初级)工商管理考试试卷(含五套)含答案
评论
0/150
提交评论