《计算机图形学实验报告(共20页).doc》由会员分享,可在线阅读,更多相关《计算机图形学实验报告(共20页).doc(20页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、精选优质文档-倾情为你奉上计算机图形学基础实验报告院 系: 计算机科学学院 班 级: 2012级4班 姓 名: 彭晓 学 号: 实验二 直线生成算法的实现1实验目的: 理解基本图形元素光栅化的基本原理,掌握一种基本图形元素光栅化算法,利用OpenGL实现直线光栅化的DDA算法。2实验内容:(1) 根据所给的直线光栅化的示范源程序,在计算机上编译运行,输出正确结果;(2) 指出示范程序采用的算法,以此为基础将其改造为中点线算法或Bresenham算法,写入实验报告;(3) 根据示范代码,将其改造为圆的光栅化算法,写入实验报告;(4) 了解和使用OpenGL的生成直线的命令,来验证程序运行结果。3
2、实验原理: 示范代码原理参见教材直线光栅化一节中的DDA算法。下面介绍下OpenGL画线的一些基础知识和glutReshapeFunc()函数。 (1)数学上的直线没有宽度,但OpenGL的直线则是有宽度的。同时,OpenGL的直线必须是有限长度,而不是像数学概念那样是无限的。可以认为,OpenGL的“直线”概念与数学上的“线段”接近,它可以由两个端点来确定。这里的线由一系列顶点顺次连结而成,有闭合和不闭合两种。 前面的实验已经知道如何绘“点”,那么OpenGL是如何知道拿这些顶点来做什么呢?是一个一个的画出来,还是连成线?或者构成一个多边形?或是做其它事情呢?为了解决这一问题,OpenGL要
3、求:指定顶点的命令必须包含在glBegin函数之后,glEnd函数之前(否则指定的顶点将被忽略),并由glBegin来指明如何使用这些点。例如:glBegin(GL_POINTS);glVertex2f(0.0f, 0.0f);glVertex2f(0.5f, 0.0f);glEnd(); 则这两个点将分别被画出来。如果将GL_POINTS替换成GL_LINES,则两个点将被认为是直线的两个端点,OpenGL将会画出一条直线。还可以指定更多的顶点,然后画出更复杂的图形。另一方面,glBegin支持的方式除了GL_POINTS和GL_LINES,还有GL_LINE_STRIP,GL_LINE_L
4、OOP,GL_TRIANGLES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN。 (2)首次打开窗口、移动窗口和改变窗口大小时,窗口系统都将发送一个事件,以通知程序员。如果使用的是GLUT,通知将自动完成,并调用向glutReshapeFunc()注册的函数。该函数必须完成下列工作: 重新建立用作新渲染画布的矩形区域; 定义绘制物体时使用的坐标系。 在GLUT内部,将给该函数传递两个参数:窗口被移动或修改大小后的宽度和高度,单位为像素。glViewport()调整像素矩形,用于绘制整个窗口。接下来三个函数调整绘图坐标系,使左下角位置为(0, 0),右上角为(w, h)。4
5、实验代码:#include void LineDDA(int x0,int y0,int x1,int y1/*,int color*/)int x, dy, dx, y;float m;dx=x1-x0;dy=y1-y0;m=dy/dx;y=y0; glColor3f (1.0f, 1.0f, 0.0f); glPointSize(1);for(x=x0;x=x1; x+)glBegin (GL_POINTS);glVertex2i (x, (int)(y+0.5);glEnd ();y+=m; void myDisplay(void)glClear(GL_COLOR_BUFFER_BIT)
6、;glColor3f (1.0f, 0.0f, 0.0f); glRectf(25.0, 25.0, 75.0, 75.0); glPointSize(5);glBegin (GL_POINTS);glColor3f (0.0f, 1.0f, 0.0f); glVertex2f (0.0f, 0.0f);glEnd (); LineDDA(0, 0, 200, 300); glBegin (GL_LINES);glColor3f (1.0f, 0.0f, 0.0f); glVertex2f (100.0f, 0.0f);glColor3f (0.0f, 1.0f, 0.0f); glVerte
7、x2f (180.0f, 240.0f);glEnd (); glFlush(); void Init()glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_FLAT); void Reshape(int w, int h)glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);int main(int argc, char *arg
8、v)glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(400, 400);glutCreateWindow(Hello World!);Init();glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutMainLoop();return 0;5实验小结: 在这次实验中,学习了画线的方法,一个点一个点的画出,通过初始结点和末结点的坐标,来决策下一个结点的
9、坐标。对计算机中的画图方法有了进一层理解,对像素点也有了多一些的理解,希望以后可以更多的了解。1实验目的: 理解掌握一个OpenGL程序平移、旋转、缩放变换的方法。2实验内容: (1)阅读实验原理,运行示范实验代码,掌握OpenGL程序平移、旋转、缩放变换的方法; (2)根据示范代码,尝试完成实验作业;3实验原理:(1)OpenGL下的几何变换 在OpenGL的核心库中,每一种几何变换都有一个独立的函数,所有变换都在三维空间中定义。 平移矩阵构造函数为glTranslate(tx, ty, tz),作用是把当前矩阵和一个表示移动物体的矩阵相乘。tx, ty,tz指定这个移动物体的矩阵,它们可以
10、是任意的实数值,后缀为f(单精度浮点float)或d(双精度浮点double),对于二维应用来说,tz=0.0。 旋转矩阵构造函数为glRotate(theta, vx, vy, vz),作用是把当前矩阵和一个表示旋转物体的矩阵相乘。theta, vx, vy, vz指定这个旋转物体的矩阵,物体将绕着(0,0,0)到(x,y,z)的直线以逆时针旋转,参数theta表示旋转的角度。向量v=(vx, vy,vz)的分量可以是任意的实数值,该向量用于定义通过坐标原点的旋转轴的方向,后缀为f(单精度浮点float)或d(双精度浮点double),对于二维旋转来说,vx=0.0,vy=0.0,vz=1.
11、0。 缩放矩阵构造函数为glScale(sx, sy, sz),作用是把当前矩阵和一个表示缩放物体的矩阵相乘。sx, sy,sz指定这个缩放物体的矩阵,分别表示在x,y,z方向上的缩放比例,它们可以是任意的实数值,当缩放参数为负值时,该函数为反射矩阵,缩放相对于原点进行,后缀为f(单精度浮点float)或d(双精度浮点double)。 注意这里都是说“把当前矩阵和一个表示移动物体的矩阵相乘”,而不是直接说“这个函数就是旋转”或者“这个函数就是移动”,这是有原因的,马上就会讲到。 假设当前矩阵为单位矩阵,然后先乘以一个表示旋转的矩阵R,再乘以一个表示移动的矩阵T,最后得到的矩阵再乘上每一个顶点的
12、坐标矩阵v。那么,经过变换得到的顶点坐标就是(RT)v)。由于矩阵乘法满足结合率,(RT)v) = R(Tv),换句话说,实际上是先进行移动,然后进行旋转。即:实际变换的顺序与代码中写的顺序是相反的。由于“先移动后旋转”和“先旋转后移动”得到的结果很可能不同,初学的时候需要特别注意这一点。(2)OpenGL下的各种变换简介我们生活在一个三维的世界如果要观察一个物体,我们可以: 1、从不同的位置去观察它(人运动,选定某个位置去看)。(视图变换) 2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它(物体运动,让人看它的不同部分)。(模型变换) 3、如果把物体画下来,我们
13、可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(指定看的范围)。(投影变换) 4、我们可能希望把整个看到的图形画下来,但它只占据纸张的一部分,而不是全部(指定在显示器窗口的那个位置显示)。(视口变换)这些,都可以在OpenGL中实现。 从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。 由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函
14、数,像这样: glMatrixMode(GL_MODELVIEW); 该语句指定一个44的建模矩阵作为当前矩阵。 通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。把当前矩阵设置为单位矩阵的函数为: glLoadIdentity(); 我们在进行矩阵操作时,有可能需要先保存某个矩阵,过一段时间再恢复它。当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。OpenGL规定堆栈的容量至少可以容纳32个矩阵,某些OpenGL实现中,堆栈的容量实际上超过了32个。
15、因此不必过于担心矩阵的容量问题。 通常,用这种先保存后恢复的措施,比先变换再逆变换要更方便,更快速。 注意:模型视图矩阵和投影矩阵都有相应的堆栈。使用glMatrixMode来指定当前操作的究竟是模型视图矩阵还是投影矩阵。4实验代码:#include #include #include /* 初始化显示窗口大小 */GLsizei winWidth=600,winHeight=600; /* 设置世界坐标系的显示范围 */GLfloat xwcMin=-300.0,xwcMax=300.0;GLfloat ywcMin=-300.0,ywcMax=300.0;void init (void)
16、/* 设置显示窗口的背景颜色为白色 */glClearColor(1.0,1.0,1.0,0.0);class wcPt3Dpublic:GLfloat x, y, z; /* 三维旋转变换,参数:旋转轴(由点p1和p2定义)和旋转角度(thetaDegrees)*/void rotate3D (wcPt3D p1, wcPt3D p2, GLfloat thetaDegrees) /* 设置旋转轴的矢量 */float vx = (p2.x - p1.x);float vy = (p2.y - p1.y);float vz = (p2.z - p1.z);/*通过平移-旋转-平移复合变换序列
17、完成任意轴的旋转(注意OpenGL中的反序表示)*/glTranslatef (p1.x, p1.y, p1.z); /移动p1到原始位置/*关于通过坐标原点的坐标轴旋转*/glRotatef (thetaDegrees, vx, vy, vz);glTranslatef (-p1.x, -p1.y, -p1.z); /移动p1到原点位置/* 三维比例放缩变换,参数:比例系数sx、sy、sz和固定点fixedPt */void scale3D (GLfloat sx, GLfloat sy, GLfloat sz, wcPt3D fixedPt) /*通过平移-放缩-平移复合变换序列完成任意点
18、为中心点的比例缩放*/* 反平移到原始位置*/glTranslatef (fixedPt.x, fixedPt.y, fixedPt.z);glScalef (sx, sy, sz); / 基于原点的比例放缩变换/* 移动固定点到坐标原点*/glTranslatef (-fixedPt.x, -fixedPt.y, -fixedPt.z);void displayFcn (void) /* 设置变换中心点位置 */wcPt3D centroidPt,R_p1, R_p2;centroidPt.x=50;centroidPt.y=100;centroidPt.z=0;R_p1=centroidP
19、t;R_p2.x=50;R_p2.y=100;R_p2.z=1; /* 设置几何变换参数*/wcPt3D p1,p2,fixedPt;p1= R_p1;p2= R_p2;fixedPt=centroidPt;GLfloat tx=0.0,ty=100.0,tz=0;GLfloat sx=0.5,sy=0.5,sz=1;GLdouble thetaDegrees = 90;glClear(GL_COLOR_BUFFER_BIT); / 清空显示窗口glMatrixMode (GL_MODELVIEW);glLoadIdentity(); /清空变换矩阵为单位矩阵,恢复原始坐标系环境/* 显示变换
20、前几何对象 */glColor3f(0.0,0.0,1.0); / 设置前景色为蓝色glRecti(50,100,200,150); /显示蓝色矩形(变换前)/* 执行几何变换(注意以反序形式写出)*/glTranslatef (tx, ty, tz); / 平移变换scale3D (sx, sy, sz, fixedPt); / 比例放缩变换rotate3D (p1, p2, thetaDegrees); / 旋转变换/* 显示变换后几何对象 */glColor3f(1.0,0.0,0.0); /重新设置前景色为红色glRecti(50,100,200,150); /显示红色矩形(变换后)g
21、lFlush();void winReshapeFcn(GLint newWidth,GLint newHeight)glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(xwcMin,xwcMax,ywcMin,ywcMax);glClear(GL_COLOR_BUFFER_BIT);void main(int argc, char * argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);glutInitWindowPosition(50,50);gl
22、utInitWindowSize(winWidth,winHeight);glutCreateWindow(三维几何变换实例-OpenGL版复合变换);init();glutDisplayFunc(displayFcn);glutReshapeFunc(winReshapeFcn);glutMainLoop();5实验小结: 通过本次实验,我对OpenGL进行图形生成的操作有了更加深入的了解,学习了平移、旋转、缩放变换的方法,同时也熟悉了模型视图矩阵和投影矩阵都有相应的堆栈。发现编程其实挺有趣的,希望以后能继续在编程中的乐趣和培养、保持自己的兴趣。1实验目的: 理解掌握OpenGL程序的模型视
23、图变换。2实验内容:(1)阅读实验原理,运行示范实验代码,理解掌握OpenGL程序的模型视图变换;(2)根据示范代码,尝试完成实验作业;3实验原理:我们生活在一个三维的世界如果要观察一个物体,我们可以: 1、从不同的位置去观察它(人运动,选定某个位置去看)。(视图变换) 2、移动或者旋转它,当然了,如果它只是计算机里面的物体,我们还可以放大或缩小它(物体运动,让人看它的不同部分)。(模型变换) 3、如果把物体画下来,我们可以选择:是否需要一种“近大远小”的透视效果。另外,我们可能只希望看到物体的一部分,而不是全部(指定看的范围)。(投影变换) 4、我们可能希望把整个看到的图形画下来,但它只占据
24、纸张的一部分,而不是全部(指定在显示器窗口的那个位置显示)。(视口变换) 从“相对移动”的观点来看,改变观察点的位置与方向和改变物体本身的位置与方向具有等效性。在OpenGL中,实现这两种功能甚至使用的是同样的函数。 由于模型和视图的变换都通过矩阵运算来实现,在进行变换前,应先设置当前操作的矩阵为“模型视图矩阵”。设置的方法是以GL_MODELVIEW为参数调用glMatrixMode函数,像这样: glMatrixMode(GL_MODELVIEW); 该语句指定一个44的建模矩阵作为当前矩阵。 通常,我们需要在进行变换前把当前矩阵设置为单位矩阵。把当前矩阵设置为单位矩阵的函数为: glLo
25、adIdentity(); 我们在进行矩阵操作时,有可能需要先保存某个矩阵,过一段时间再恢复它。当我们需要保存时,调用glPushMatrix()函数,它相当于把当前矩阵压入堆栈。当需要恢复最近一次的保存时,调用glPopMatrix()函数,它相当于从堆栈栈顶弹出一个矩阵为当前矩阵。OpenGL规定堆栈的容量至少可以容纳32个矩阵,某些OpenGL实现中,堆栈的容量实际上超过了32个。因此不必过于担心矩阵的容量问题。 通常,用这种先保存后恢复的措施,比先变换再逆变换要更方便,更快速。 注意:模型视图矩阵和投影矩阵都有相应的堆栈。使用glMatrixMode来指定当前操作的究竟是模型视图矩阵还
26、是投影矩阵。 在代码中,视图变换必须出现在模型变换之前,但可以在绘图之前的任何时候执行投影变换和视口变换。 1.display()程序中绘图函数潜在的重复性强调了:在指定的视图变换之前,应该使用glLoadIdentity()函数把当前矩阵设置为单位矩阵。 2.在载入单位矩阵之后,使用gluLookAt()函数指定视图变换。如果程序没有调用gluLookAt(),那么照相机会设定为一个默认的位置和方向。在默认的情况下,照相机位于原点,指向Z轴负方向,朝上向量为(0,1,0)。 3.一般而言,display()函数包括:视图变换 + 模型变换 + 绘制图形的函数(如glutWireCube()。
27、display()会在窗口被移动或者原来先遮住这个窗口的东西被一开时,被重复调用,并经过适当变换,保证绘制的图形是按照希望的方式进行绘制。 4.在调用glFrustum()设置投影变换之前,在reshape()函数中有一些准备工作:视口变换 + 投影变换 + 模型视图变换。由于投影变换,视口变换共同决定了场景是如何映射到计算机的屏幕上的,而且它们都与屏幕的宽度,高度密切相关,因此应该放在reshape()中。reshape()会在窗口初次创建,移动或改变时被调用。OpenGL中矩阵坐标之间的关系: 物理坐标*模型视图矩阵*投影矩阵*透视除法*规范化设备坐标窗口坐标 (1)视图变换函数gluLo
28、okAt(0.0,0.0,5.0,0.0,0.0,0.0,0.0,1.0,0.0,)设置照相机的位置 把照相机放在(0,0,5),镜头瞄准(0,0,0),朝上向量定为(0,1,0)朝上向量为照相机指定了一个唯一的方向。如果没有调用gluLookAt,照相机就设定一个默认的位置和方向,在默认情况下,照相机位于原点,指向Z轴的负方向,朝上向量为(0,1,0) glLoadIdentity()函数把当前矩阵设置为单位矩阵。 (2)使用模型变换的目的是设置模型的位置和方向 (3)投影变换,指定投影变换类似于为照相机选择镜头,可以认为这种变换的目的是确定视野,并因此确定哪些物体位于视野之内以及他们能够被
29、看到的程度。 除了考虑视野之外,投影变换确定物体如何投影到屏幕上,OpenGL提供了两种基本类型的投影,1、透视投影:远大近小;2、正投影:不影响相对大小,一般用于建筑和CAD应用程序中。 (4)视口变换 视口变换指定一个图象在屏幕上所占的区域。 (5)绘制场景4实验代码: #include #include static int year = 0, day = 0;void init(void)glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_FLAT);void display(void)glClear (GL_COLOR_BUFFER_
30、BIT);glColor3f (1.0, 1.0, 1.0);glPushMatrix();glutWireSphere(1.0, 20, 16); /* draw sun */glRotatef (GLfloat) year, 0.0, 1.0, 0.0);glTranslatef (2.0, 0.0, 0.0);glRotatef (GLfloat) day, 0.0, 1.0, 0.0);glutWireSphere(0.2, 10, 8); /* draw smaller planet */glPopMatrix();glutSwapBuffers();void reshape (in
31、t w, int h)glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity ();gluPerspective(60.0, (GLfloat) w/(GLfloat) h, 1.0, 20.0);glMatrixMode(GL_MODELVIEW);glLoadIdentity();gluLookAt (0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0);void keyboard (unsigned char key, int x,
32、int y)switch (key) case d:day = (day + 10) % 360;glutPostRedisplay();break;case D:day = (day - 10) % 360;glutPostRedisplay();break;case y:year = (year + 5) % 360;glutPostRedisplay();break;case Y:year = (year - 5) % 360;glutPostRedisplay();break;case 27:exit(0);break;default:break; int main(int argc,
33、 char* argv) glutInit(&argc, argv);glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);glutInitWindowSize (500, 500);glutInitWindowPosition (100, 100);glutCreateWindow (argv0);init ();glutDisplayFunc(display);glutReshapeFunc(reshape);glutKeyboardFunc(keyboard);glutMainLoop();return 0;5.实验小结: 通过本次实验,我掌握了Ope
34、nGL程序的模型视图变换。除了考虑视野之外,投影变换确定物体如何投影到屏幕上, 实际变换的顺序与代码中写的顺序是相反的。由于“先移动后旋转”和“先旋转后移动”得到的结果很可能不同,初学的时候需要特别注意这一点。 1实验目的: 了解曲线的生成原理,掌握几种常见的曲线生成算法,利用VC+OpenGL实现Bezier曲线生成算法。2实验内容:(1) 结合示范代码了解曲线生成原理与算法实现,尤其是Bezier曲线;(2) 调试、编译、修改示范程序。(3) 尝试实现B样条曲线算法。3实验原理: Bezier曲线是通过一组多边形折线的顶点来定义的。如果折线的顶点固定不变,则由其定义的Bezier曲线是唯一
35、的。在折线的各顶点中,只有第一点和最后一点在曲线上且作为曲线的起始处和终止处,其他的点用于控制曲线的形状及阶次。曲线的形状趋向于多边形折线的形状,要修改曲线,只要修改折线的各顶点就可以了。因此,多边形折线又称Bezier曲线的控制多边形,其顶点称为控制点。三次多项式,有四个控制点,其数学表示如下:4实验代码:#include #include #include #include using namespace std;struct Point int x, y;Point pt4, bz11;vector vpt;bool bDraw;int nInput;void CalcBZPoints(
36、)float a0,a1,a2,a3,b0,b1,b2,b3;a0=pt0.x;a1=-3*pt0.x+3*pt1.x;a2=3*pt0.x-6*pt1.x+3*pt2.x;a3=-pt0.x+3*pt1.x-3*pt2.x+pt3.x;b0=pt0.y;b1=-3*pt0.y+3*pt1.y;b2=3*pt0.y-6*pt1.y+3*pt2.y;b3=-pt0.y+3*pt1.y-3*pt2.y+pt3.y;float t = 0;float dt = 0.01;for(int i = 0; t1.1; t+=0.1, i+) bzi.x = a0+a1*t+a2*t*t+a3*t*t*t;
37、bzi.y = b0+b1*t+b2*t*t+b3*t*t*t; void ControlPoint(vector vpt)glPointSize(2);for(int i=0; ivpt.size(); i+) glBegin (GL_POINTS);glColor3f (1.0f, 0.0f, 0.0f); glVertex2i (vpti.x,vpti.y);glEnd ();void PolylineGL(Point *pt, int num) glBegin (GL_LINE_STRIP);for(int i=0;i 0) ControlPoint(vpt);if(bDraw) Po
38、lylineGL(pt, 4);CalcBZPoints();PolylineGL(bz, 11);glFlush();void Init() glClearColor(0.0, 0.0, 0.0, 0.0);glShadeModel(GL_SMOOTH);printf(Please Click left button of mouse to input control point of Bezier Curve!n);void Reshape(int w, int h)glViewport(0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode(GL_PRO
39、JECTION);glLoadIdentity();gluOrtho2D(0.0, (GLdouble) w, 0.0, (GLdouble) h);void mouse(int button, int state, int x, int y) switch (button) case GLUT_LEFT_BUTTON:if (state = GLUT_DOWN) if (nInput = 0) pt0.x = x;pt0.y = 480 - y;nInput = 1;vpt.clear();vpt.push_back(pt0);bDraw = false;glutPostRedisplay(
40、);/else if (nInput = 1) pt1.x = x;pt1.y = 480 - y;vpt.push_back(pt1);nInput = 2;glutPostRedisplay();/else if (nInput = 2) pt2.x = x;pt2.y = 480 - y;vpt.push_back(pt2);nInput = 3;glutPostRedisplay();/else if (nInput = 3) pt3.x = x;pt3.y = 480 - y;bDraw = true;vpt.push_back(pt3);nInput = 0;glutPostRed
41、isplay();/ break;default:break; int main(int argc, char *argv)glutInit(&argc, argv);glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);glutInitWindowPosition(100, 100);glutInitWindowSize(640, 480);glutCreateWindow(Hello World!);Init();glutDisplayFunc(myDisplay);glutReshapeFunc(Reshape);glutMouseFunc(mouse);glutMainLoop();return 0;5实验小结:通过本次实验,我掌握了Bezier曲线在本质上是由调和函数根据控制点插值生成的,一次多项式有两个控制点,二次多项式三个控制点,要求取参数t处的型值点,最后进行连线。Bezier在工程中广泛应用,本次试验老师已经把这些图形画法的算法和实现都给了我们,我们只要去修改些算法的参数就可以了。但我还是去尝试着自己去建立了些工程,但最后还是发现挺麻烦的,所以放弃了。 通过本门课程的实验,我深深地体会到了图形学的深奥和美丽之处,我发现自己已经喜欢上计算机图形学这门课程了,它与我们的生活息息相关,值得我们为之探索和钻研。专心-专注-专业
限制150内