计算机图形学实验报告(一).doc
(完整word版)计算机图形学实验报告

计算机图形学实验报告姓名:谢云飞学号:20112497班级:计算机科学与技术11-2班实验地点:逸夫楼507实验时间:2014.03实验1直线的生成1实验目的和要求理解直线生成的原理;掌握典型直线生成算法;掌握步处理、分析实验数据的能力;编程实现DDA算法、Bresenham中点算法;对于给定起点和终点的直线,分别调用DDA算法和Bresenham中点算法进行批量绘制,并记录两种算法的绘制时间;利用excel等数据分析软件,将试验结果编制成表格,并绘制折线图比较两种算法的性能。
2实验环境和工具开发环境:Visual C++ 6.0实验平台:Experiment_Frame_One(自制平台)。
本实验提供名为 Experiment_Frame_One的平台,该平台提供基本绘制、设置、输入功能,学生在此基础上实现DDA算法和Mid_Bresenham算法,并进行分析。
⏹平台界面:如错误!未找到引用源。
所示⏹设置:通过view->setting菜单进入,如错误!未找到引用源。
所示⏹输入:通过view->input…菜单进入.如错误!未找到引用源。
所示⏹实现算法:◆DDA算法:void CExperiment_Frame_OneView::DDA(int X0,int Y0, int X1, int Y1)Mid_Bresenham法:void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1)3实验结果3.1程序流程图1)DDA算法流程图:开始定义两点坐标差dx,dy,以及epsl,计数k=0,描绘点坐标x,y,x增量xIncre,y增量yIncre↓输入两点坐标x1,y1,x0,y0↓dx=x1-x0,dy=y1-y0;_________↓_________↓↓若|dx|>|dy| 反之epsl=|dx| epsl=|dy|↓________...________↓↓xIncre=dx/epsl; yIncre=dy/epsl↓填充(强制整形)(x+0.5,y+0.5);↓←←←←横坐标x+xIncre;纵坐标y+yIncre;↓↑若k<=epsl →→→k++↓结束2)Mid_Bresenham算法流程图开始↓定义整形dx,dy,判断值d,以及UpIncre,DownIncre,填充点x,y↓输入x0,y0,x1,y1______↓______↓↓若x0>x1 反之x=x1;x1=x0;x0=x; x=x0;Y=y1;y1=y0;y0=y; y=y0;↓______..______↓↓坐标差dx=x1-x0;dy=y1-y0;判断值d=dx-2*dy;UpIncre=2*dx-2*dy;DownIncre=-2*dy;↓填充点(x,y),且x=x+1;______↓______←←←↓↓↑若d<0 反之y=y+1,且d=d+UpIncre d=d+DownIncre↓______.______↓↑↑↓若x<=x1 →→→↑↓结束3.2程序代码void CExperiment_Frame_OneView::DDA(int X0, int Y0, int X1, int Y1){//----------请实现DDA算法------------//int dx,dy,epsl,k;float x,y,xIncre,yIncre;dx=X1-X0; dy=Y1-X0;x=X0; y=Y0;if(abs(dx)>abs(dy)) epsl=abs(dx);else epsl=abs(dy);xIncre=(float)dx/(float)epsl;yIncre=(float)dy/(float)epsl;for(k=0;k<=epsl;k++){DrawPixel((int)(x+0.5),(int)(y+0.5));x+=xIncre;y+=yIncre;}}void CExperiment_Frame_OneView::Mid_Bresenham(int X0, int Y0, int X1, int Y1){//-------请实现Mid_Bresenham算法-------//int dx,dy,d,UpIncre,DownIncre,x,y,xend;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){DrawPixel(x,y);x++;if(d<0){y++;d+=UpIncre;}else d+=DownIncre;}}3.3运行结果3.4运行结果分析DDA算法基本上没有什么问题,Mid_Bresenham算法在网格尺寸比较大时误差较大,通过改变网格尺寸大小即能较为精确地描绘出所绘直线。
计算机图形学实验报告

计算机图形学实验报告实验一 3D模型的加载、渲染与三维操作学院:专业班级:指导老师:学号:姓名:完成日期:目录一、实验目的 (3)二、使用的工具软件及环境 (3)三、实验内容 (3)四、实验步骤 (3)五、思考 (12)一、实验目的1、掌握在Microsoft Visual Studio环境中使用OpenGL、GLUT 和GLUI;2、了解计算机图形学固定流水线;3、了解OpenGL编程基础;4、掌握三维观察的数学表达和程序实现;5、掌握多边形网格的绘制;二、使用的工具软件及环境Microsoft Visual Studio 2010、OpenGL、Glut、Glui三、实验内容1、在VS 2010中配置OpenGL环境;2、编译简单的GLUT程序;3、编译GLUI源代码,并在调试模式下执行6个示例程序;4、在给定的工程中添加绘制简单几何体的代码;5、在给定的工程中添加读取、绘制三维模型的代码;6、在给定的工程中添加旋转、平移和缩放的控制代码;四、实验步骤1、安装Microsoft Visual Studio软件版本选择:Microsoft Visual Studio 2010以上版本2、VS2010中配置GLUT1)下载GLUT。
Windows环境下的GLUT下载地址:/resources/libraries/glut/glutdlls37be ta.zip2)将下载的压缩包解开,将得到5个文件:glut.h、glut.lib、glut32.lib、glut.dll、glut32.dll。
3)将glut.h放到"%WinDir%\ProgramFiles(x86)\Microsoft SDKs\Windows\v7.0A\Include\gl\"文件夹中。
4)将glut.lib和glut32.lib放到"%WinDir%\ProgramFiles(x86)\Microsoft Visual Studio 10.0\VC\lib\"文件夹中。
计算机图形学实验报告,DOC

glClearColor(1.0f,1.0f,1.0f,0.0f);
glLineWidth(12.0f);
glColor4f(0.0,0.6,1.0,1.0);
lineList=glGenLists(1);//获得一个显示列表标识
glNewList(lineList,GL_COMPILE);//定义显示列表
glVertex2f(x,y);
if(d<0)d+=2*x+3;
else{
d+=2*(x-y)+5;
y--;
}
x++;
}
glEnd();
}
voiddisplay()
{
glClearColor(1,1,1,1);
glClear(GL_COLOR_BUFFER_BIT);
glColor3f(1,0,0);
glClear(GL_COLOR_BUFFER_BIT);
winWidth=newWidth;
winHeight=newHeight;
}
intmain(intargc,char*argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glBegin(GL_POINTS);
glVertex2i(int(x+0.5),(int)(y+0.5));
glEnd();
x+=xIncre;
y+=yIncre;
}
}
voidDisplay(void)
{
glClear(GL_COLOR_BUFFER_BIT);
计算机图形学实验报告一

计算机图形学实验报告⼀实验⼀直线、圆、椭圆的⽣成算法⼀、实验⽬的与内容⽬的:利⽤实验使我对所学的图形⽣成算法加深印象,并且练习书写规范的实验报告格式。
1、了解VC编程环境中常⽤控件命令和绘图函数,掌握处理图形的基本⽅法;2、实现直线⽣成算法:数值微分法、中点画线法、Bresenham画线法;3、实现圆的⽣成算法:简单画圆法、中点画圆法、Bresenham画圆法;4、实现椭圆⽣成算法:中点画椭圆法。
⼆、实验前准备:算法分析使⽤开发环境VC++6.0,建⽴⼯程MFC AppWizard exe,选择单⽂档。
进⼊IDR_MAINFRAME,编辑菜单栏,对需要处理的菜单项标题“建⽴类向导”,添加消息映射函数,在映射的函数处添加相应算法的程序代码,就可以完成整个程序。
算法的学习和理解是图形学学习的重要部分,以下对各种算法进⾏分析和总结:1、DDA算法⽣成直线斜率是DDA算法的关键,⽤两点坐标很容易可以得到斜率k,但这⾥要注意k是float。
如果k的绝对值在0和1之间,每次画点x++,y+k再进⾏四舍五⼊(因为x此时⽐y的变化快)。
否则,y++。
也就是为了保持每次+k(或1/k)要⼩于1。
不⽤对k的正负有太多考虑,例如point1(100,100),point2(200,200),可能得到k=-1,这时我们就从point1开始画点,所得的结果是相同的。
2、中点画线法判别式是中点画线法的关键,(0<=k<=1)判别式是为了判断下⼀个点是在当前点正右边还是右上⽅,是和中点⽐较的结果。
d的含义下⼀个点到中点的垂直距离,它的正负可以做下⼀个位置的判断。
初值:d = 2*a + b,增量:上⼀个点d>=0,则d+2*a,上⼀个点d<=0,则d+2*(a+b)。
3、Bresenham算法⽣成直线由误差d的符号来决定下⼀个像素是在正右⽅合适右上⽅。
d的实际意义是实际点到模拟点的垂直距离,我们让它保持在1以内(>=1时,做-1)。
计算机图形学实验报告

计算机图形学实验报告
实验目的:通过本次实验,深入了解并掌握计算机图形学的基本原理和相关技术,培养对图形处理的理解和能力。
实验内容:
1. 图像的基本属性
- 图像的本质及表示方法
- 像素和分辨率的概念
- 灰度图像和彩色图像的区别
2. 图像的处理技术
- 图像的采集和处理
- 图像的变换和增强
- 图像的压缩和存储
3. 计算机图形学的应用
- 图像处理在生活中的应用
- 计算机辅助设计中的图形学应用
- 三维建模和渲染技术
实验步骤和结果:
1. 在计算机图形学实验平台上加载一张测试图像,分析其像素构成
和基本属性。
2. 运用图像处理技术,对测试图像进行模糊、锐化、色彩调整等操作,观察处理后的效果并记录。
3. 学习并掌握计算机图形学中常用的处理算法,如卷积、滤波等,
尝试应用到测试图像上并进行实验验证。
4. 探讨计算机图形学在数字媒体制作、虚拟现实、计算机辅助设计
等领域的应用案例,并总结其在实践中的重要性和价值。
结论:
通过本次实验,我对计算机图形学有了更深入的了解,掌握了图像
处理技术的基本原理和应用方法。
计算机图形学作为一门重要的学科,对多个领域有着广泛的应用前景,有助于提高数字媒体技术、虚拟现
实技术等领域的发展水平。
希望在未来的学习和工作中能进一步深化
对计算机图形学理论和实践的研究,不断提升自己在这一领域的专业
能力和创新意识。
《计算机图形学》实验报告

《计算机图形学》实验报告一、实验目的计算机图形学是一门研究如何利用计算机生成、处理和显示图形的学科。
通过本次实验,旨在深入理解计算机图形学的基本原理和算法,掌握图形的生成、变换、渲染等技术,并能够运用所学知识解决实际问题,提高对图形学的应用能力和编程实践能力。
二、实验环境本次实验使用的编程语言为 Python,使用的图形库为 Pygame。
开发环境为 PyCharm。
三、实验内容1、直线的生成算法DDA 算法(Digital Differential Analyzer)Bresenham 算法DDA 算法是通过计算直线的斜率来确定每个像素点的位置。
它的基本思想是根据直线的斜率和起始点的坐标,逐步计算出直线上的每个像素点的坐标。
Bresenham 算法则是一种基于误差的直线生成算法。
它通过比较误差值来决定下一个像素点的位置,从而减少了计算量,提高了效率。
在实验中,我们分别实现了这两种算法,并比较了它们的性能和效果。
2、圆的生成算法中点画圆算法中点画圆算法的核心思想是通过判断中点的位置来确定圆上的像素点。
通过不断迭代计算中点的位置,逐步生成整个圆。
在实现过程中,需要注意边界条件的处理和误差的计算。
3、图形的变换平移变换旋转变换缩放变换平移变换是将图形在平面上沿着指定的方向移动一定的距离。
旋转变换是围绕一个中心点将图形旋转一定的角度。
缩放变换则是改变图形的大小。
通过矩阵运算来实现这些变换,可以方便地对图形进行各种操作。
4、图形的填充种子填充算法扫描线填充算法种子填充算法是从指定的种子点开始,将相邻的具有相同颜色或属性的像素点填充为指定的颜色。
扫描线填充算法则是通过扫描图形的每一行,确定需要填充的区间,然后进行填充。
在实验中,我们对不同形状的图形进行了填充,并比较了两种算法的适用情况。
四、实验步骤1、直线生成算法的实现定义直线的起点和终点坐标。
根据所选的算法(DDA 或Bresenham)计算直线上的像素点坐标。
计算机图形学实验报告

实验结果与结论
• 在本次实验中,我们成功地实现了复杂场景的渲染,得到了具有较高真实感和视觉效果的图像。通过对比 实验前后的效果,我们发现光线追踪和着色器的运用对于提高渲染质量和效率具有重要作用。同时,我们 也发现场景图的构建和渲染脚本的编写对于实现复杂场景的渲染至关重要。此次实验不仅提高了我们对计 算机图形学原理的理解和实践能力,也为我们后续深入研究渲染引擎的实现提供了宝贵经验。
2. 通过属性设置和变换操作,实现了对图形的定 制和调整,加深了对图形属性的理解。
4. 实验的不足之处:由于时间限制,实验只涉及 了基本图形的绘制和变换,未涉及更复杂的图形 处理算法和技术,如光照、纹理映射等。需要在 后续实验中进一步学习和探索。
02
实验二:实现动画效果
实验目的
掌握动画的基本原 理和实现方法
04
实验四:渲染复杂场景
实验目的
掌握渲染复杂场景的基本流程和方法 理解光线追踪和着色器在渲染过程中的作用
熟悉渲染引擎的实现原理和技巧 提高解决实际问题的能力
实验步骤
• 准备场景文件 • 使用3D建模软件(如Blender)创建或导入场景模型,导出为常用的3D格式(如.obj或.fbx)。 • 导入场景文件 • 在渲染引擎(如Unity或Unreal Engine)中导入准备好的场景文件。 • 构建场景图 • 根据场景的层次结构和光照需求,构建场景图(Scene Graph)。 • 设置光照和材质属性 • 为场景中的物体设置光照和材质属性(如漫反射、镜面反射、透明度等)。 • 编写渲染脚本 • 使用编程语言(如C或JavaScript)编写渲染脚本,控制场景中物体的渲染顺序和逻辑。 • 运行渲染程序 • 运行渲染程序,观察渲染结果。根据效果调整光照、材质和渲染逻辑。 • 导出渲染图像 • 将渲染结果导出为图像文件(如JPEG或PNG),进行后续分析和展示。
计算机图形学实验报告1

实验报告实验课程:学生姓名:学号:专业班级:2014年12月07日目录实验二几何变换实验三二维基本图形生成的算法实现实验四二维填充图的生成算法实验五曲线的生成算法实现实验二 几何变换一、实验名称几何变换二、实验目的1. 掌握二维图形基本的几何变换原理及变换矩阵;2. 掌握矩阵运算的程序设计。
三、实验内容1. 掌握二维图形的齐次坐标表示方法;2. 实现二维图形的基本变换,如进行平移变换等。
四、算法描述二维图形齐次坐标变换矩阵一般表达式:⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡=i hgf e dc b a T这3×3 矩阵中各元素功能一共可分成四块,即()()()()体放大。
则总体缩小;否则,总若变换。
:对整体图形进行伸缩处产生一个灭点。
:在处产生一个灭点。
:在:对图形做投影变换。
:对图形进行平移变换。
转、对称、错切等变换:对图形进行缩放、旋,10001000111**11>∴⎪⎪⎪⎭⎫⎝⎛===⎪⎪⎭⎫ ⎝⎛⎪⎪⎭⎫ ⎝⎛i i y x y x i hx h g x g h g f c e b d a Θ五、实验步骤1. 编写二维图形基本变换如平移、旋转、缩放、比例、对称交换的通用子程序;2. 绘制矩形,调用以上的通用子程序实现图形变换,并输出交换结果;3. 上机调试程序,显示最终结果。
六、实验源程序#include <graphics.h> #include <math.h>double x1,y1,x2,y2,x3,y3,x4,y4; void pingyi(double d,double c) { double a1,b1,a2,b2; a1=x1+d; b1=y1+c; a2=x2+d; b2=y2+c;rectangle(a1,b1,a2,b2);void suofang(double s){double a1,b1,a2,b2;a1=(double)x1*s;b1=(double)y1*s;a2=(double)x2*s;b2=(double)y2*s;rectangle(a1,b1,a2,b2);}void xuanzhuan(double b) {double a1,b1,a2,b2;a1=x1*cos(b)-y1*sin(b);b1=y1*cos(b)+x1*sin(b);a2=x2*cos(b)-y2*sin(b);b2=y2*cos(b)+x2*sin(b); rectangle(a1,b1,a2,b2);}void cuoqie(double b,double d) {double a1,b1,a2,b2,a3,b3,a4,b4; a1=x1+b*y1; a3=x3+b*y3;b1=d*x1+y1; b3=d*x3+y3;a2=x2+b*y2; a4=x4+b*x4;b2=d*x2+y2; b4=d*x4+y4; line(a1,b1,a3,b3);line(a3,b3,a2,b2);line(a2,b2,a4,b4);line(a4,b4,a1,b1);void duichenpoint(){double a1,b1,a2,b2;a1=-x1;b1=-y1;a2=-x2;b2=-y2; rectangle(a1,b1,a2,b2);}void duichenx(){double a1,b1,a2,b2;a1=x1;b1=-y1;a2=x2;b2=-y2; rectangle(a1,b1,a2,b2);}void duicheny(){double a1,b1,a2,b2;a1=-x1;b1=y1;a2=-x2;b2=y2; rectangle(a1,b1,a2,b2);}void duichenxy(){double a1,b1,a2,b2;a1=y1;b1=x1;a2=y1;b2=x2; rectangle(a1,b1,a2,b2);}void duichenyx(){double a1,b1,a2,b2;a1=-y1;b1=-x1;a2=-y2;b2=-x2; rectangle(a1,b1,a2,b2);main(){ int gdriver,gmode;int select=100;double c,d,e;gdriver=DETECT;gmode=0;initgraph(&gdriver,&gmode,"d:\\tc20h\\bgi");x1=50;y1=50;x2=100;y2=100;x3=x2;y3=y1;x4=x1;y4=y2;printf("please input a rectangle's two point:(x1,y1,x2,y2)"); scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);rectangle(x1,y1,x2,y2);getch();printf("1----pingyi\n");printf("2----suofang");printf("3----xuanzhuan");printf("4----cuoqie");printf("5----guanyu yuandian duichen\n");printf("6----guanyu x duichen \n");printf("7----guanyu y duichen \n");printf("8----guanyu y=x duichen \n");printf("9----guanyu y=-x duichen \n");printf("would you want to select what:(0 is exit system!) \n"); while(select!=0){scanf("%d",&select);if(select==1){printf("what's distance to pingyi?");printf("x: ");scanf("%lf",&d);printf("y: ");scanf("%lf",&c);pingyi(d,c);}else if(select==2){printf("what's size of rectangle you want?"); scanf("%lf",&e);suofang(e);}else if(select==3){printf("xuanzhaun's size?");scanf("%lf",&e);xuanzhuan(e);}else if(select==4){printf("cuoqie's size?");scanf("%lf%lf",&c,&d);cuoqie(c,d);}else if(select==5)duichenpoint();else if(select==6)duichenx();else if(select==7)duicheny();else if(select==8)duichenxy();else if(select==9)duichenyx();elseprintf("error please again! or input 0 to exit!\n");}closegraph();system("pause");}七、程序结果及其分析通过在这次的实验刚开始,由于第一次接触编译的环境觉得无从下手,但也逐渐学到了很多东西按照图形变换的基本原理,我简单实现了图形的几种变换通过这次实验,我对二维图形的基本几何变换(平移、旋转、缩放、错切、反射、投影)和复合变换的理解更加深入了,在对图形进行复合变换时,将几个基本几何变换矩阵按一定顺序相乘便能得到一个复合矩阵,这个复合矩阵能够决定变换后图形的最终位置、形状和大小的信息。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验一OpenGL开发环境及扫描转换算法1、实验目的与要求1.通过实验掌握OpenGL中编程环境的设置,了解相关函数用途及设置步骤;2.通过实验掌握基本图形元素的生成,给出相关代码和运行结果;3.用WINDOWS GDI函数编写生成直线或区域填充的程序(选DDA或Bresenham直线算法,活性边表算法填充多边形),演示算法过程。
4.画矩形,调用一个函数画一个矩形。
画椭圆,调用一个函数画一个椭圆。
画Bezier 曲线。
2、实验方案请描述为达到实验的需要完成哪些方面的实验,列举出实验的基本要点和重点。
在工程WinAPIEX加入void createLine(HDC tmpDC)和void Polyline (tmpDC)在void createLine(HDC tmpDC)用DDA直线算法或Bresenham直线算法生成直线在void Polyline (tmpDC)添加活泩边表填充算法,生成填充四边形和八边形加入Rectangle(tmpDC,x0,y0,x1,y1);加入Ellipse (tmpDC, x0,y0,a,b) ;加入PolyBezier(tmpDC,arr_vertex,4) ;3、实验结果和数据处理1)生成直线的DDA直线算法在createLine(tmpDC)中加入以下代码int x0,y0,x1,y1,color; //自定义直线的起点(x0,y0)和终点(x1,y1),及颜色colorfloat dx,dy,x,y;int length,i;x0=50;y0=160;x1=900;y1=200;//此处修改了color=1000; color=1;if(abs(x1-x0)>=abs(y1-y0))length=abs(x1-x0);elselength=abs(y1-y0);dx=(x1-x0)/(float)length;dy=(y1-y0)/(float)length;i=1;x=(float)x0;y=(float)y0;while(i<=length){SetPixel(tmpDC,int(x+0.5),int(y+0.5),color);x+=dx;y+=dy;i++;}2)区域填充的程序在void Polyline (tmpDC) 添加活性边表填充void Polyline (HDC tmpDC) //多边形边数.{const int POINTNUM=4;//或者是八边形8/******定义结构体用于活性边表AET和新边表NET***************************** ******/typedef struct XET{float x;float dx,ymax;XET* next;}AET,NET;/******定义点结构体point**************************** **************************/struct point{float x;float y;}polypoint[POINTNUM]={100,10 0,400,100,400,400,100,400};//正方形//polypoint[POINTNUM]={600,10 0,700,100,800,200,800,300,700,400,600, 400,500,300,500,200};//八边形顶点/******计算最高点的y坐标(扫描到此结束)****************************** **********/int MaxY=0;int i;for(i=0;i<POINTNUM;i++)if(polypoint[i].y>MaxY) MaxY=(int)polypoint[i].y;/*******初始化AET表********************************* **************************/AET *pAET=new AET;pAET->next=NULL;/******初始化NET表********************************* ***************************/NET *pNET[1024];for(i=0;i<=MaxY;i++){pNET[i]=new NET;pNET[i]->next=NULL;}/******扫描并建立NET表********************************* ************************/for(i=0;i<=MaxY;i++){for(intj=0;j<POINTNUM;j++)if(polypoint[j].y==i){if(polypoint[(j-1+POINTNUM)%POINT NUM].y>polypoint[j].y){NET*p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j-1+POINTNUM) %POINTNUM].y;p->dx=(polypoint[(j-1+POINTNUM)%P OINTNUM].x-polypoint[j].x)/(polypoint [(j-1+POINTNUM)%POINTNUM].y-po lypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}if(polypoint[(j+1+POINTNUM)%POIN TNUM].y>polypoint[j].y){NET*p=new NET;p->x=polypoint[j].x;p->ymax=polypoint[(j+1+POINTNUM) %POINTNUM].y;p->dx=(polypoint[(j+1+POINTNUM)% POINTNUM].x-polypoint[j].x)/(polypoint[(j+1+POINTNUM)%POINTNUM].y-polypoint[j].y);p->next=pNET[i]->next;pNET[i]->next=p;}}}/******建立并更新活性边表AET***************************** ************************/for(i=0;i<=MaxY;i++){//计算新的交点x,更新AET***************************** ***************************/NET *p=pAET->next;while(p){p->x=p->x + p->dx;p=p->next;}//更新后新AET先排序********************************* ****************************///断表排序,不再开辟空间AET *tq=pAET;p=pAET->next;tq->next=NULL;while(p){while(tq->next && p->x >= tq->next->x)tq=tq->next;NET *s=p->next;p->next=tq->next;tq->next=p;p=s;tq=pAET;}//(改进算法)先从AET表中删除ymax==i的结点********************************* *******/AET *q=pAET;p=q->next;while(p){if(p->ymax==i){q->next=p->next;delete p;p=q->next;}else{q=q->next;p=q->next;}}//将NET中的新点加入AET,并用插入法按X值递增排序********************************* */p=pNET[i]->next;q=pAET;while(p){while(q->next && p->x >= q->next->x)q=q->next;NET *s=p->next;p->next=q->next;q->next=p;p=s;q=pAET;}/******配对填充颜色********************************* ******************************/p=pAET->next;while(p && p->next){for(floatj=p->x;j<=p->next->x;j++){SetPixel(tmpDC,static_cast<int>(j),i,RG B(255,200,0));//此处我改变了颜色,八边形的为黄色//SetPixel(tmpDC,static_cast<int>(j),i,RG B(255,0,0));//还有四边形的红色}p=p->next->next;//考虑端点情况}} }//画矩形Rectangle(tmpDC,20,20,80,80); //左上顶点,右下顶点//画椭圆Ellipse (tmpDC, 20,20,160,360) ;//画Bezier 曲线,利用已有的顶点数据PolyBezier(tmpDC,arr_vertex,4) ;实验截图:1.DDA算法的直线2.四边形和八边形3.正方形4.椭行5.Bezier 曲线实习总结:通过本次实验,我掌握了opengl绘图的一些基本知识,会在vc里面加入opengl的基本库。
实验中我掌握了DDA算法的基本思路、多边形的填充算法的基本思路和填充颜色的一些操作,以争取达到美化的功效。
本次试验老师已经把这些图形画法的算法和实现都给了我们,我们只要去修改些算法的参数就可以了。
但我还是去尝试着自己去建立了些工程,但最后还是发现挺麻烦的,所以放弃了。
通过本次实验,我深深地体会到了图形学的深奥和美丽之处,我发现自己已经喜欢上图形学这门课程了。
精品文档精品文档。