欢迎来到天天文库
浏览记录
ID:40829483
大小:43.85 KB
页数:8页
时间:2019-08-08
《实验四 自由曲线曲面算法实验(2)》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、实验四自由曲线曲面算法实验实验项目性质:设计性实验所属课程名称:3D游戏图形学实验计划学时:3学时一、实验目的和要求1.了解自由曲线和曲面的生成原理;2.掌握并实现Bezier曲线和B样条曲线的生成算法;3.实现Bezier曲面的生成算法。二、实验原理1.Bezier曲线是通过一组多边形折线的顶点来定义的。如果折线的顶点固定不变,则由其定义的Bezier曲线是唯一的。在折线的各顶点中,只有第一点和最后一点在曲线上且作为曲线的起始处和终止处,其他的点用于控制曲线的形状及阶次。曲线的形状趋向于多边形折线的形状,要修改曲线,只要修改折线的各
2、顶点就可以了。因此,多边形折线又称Bezier曲线的控制多边形,其顶点称为控制点。三次多项式,有四个控制点,如图1所示,图1三次Bezier曲线其数学表示如下:(1)其矩阵形式为(2)2.B样条曲线保留了Bezier曲线的优点,对Bezier曲线进行了拓广,用B样条基代替Bernstein基,克服了Bezier曲线由于整体表示带来的不具备局部性质的缺点。B样条曲线的数学定义为(3)式中,为n+1个控制点,由控制点顺序连成的折线称为B样条控制多边形。m是一个阶参数,可以取2到控制顶点个数n+1之间的任一整数,m-1是B样条曲线的次数。参
3、数t的选取取决于B样条结点矢量的选取。是B样条基函数,(4)是结点值,构成了m-1次B样条函数的结点矢量,其中的结点是非减序列,所生成的B样条曲线定义在从结点值到结点值的区间上,而每个基函数定义在t的取值范围内的到的子区间内。从式(3)和(4)可以看出,仅仅给定控制点和参数m还不足以完全表达B样条曲线,还需要给定结点矢量并使用公式(4)来获得基函数。对于三次均匀周期性B样条曲线,m=4,如果用4个控制点来拟合三次曲线,则n=3。假设结点矢量,于是得到基函数计算式为:(5)最终得到该B样条曲线的矩阵形式为(6)一、实验内容1.下面的代码
4、用来生成三次Bezier曲线,将代码补充完整,编译运行;修改代码,利用OpenGL函数生成三次Bezier曲线。参考代码:#include#include#include#includeusingnamespacestd;structPoint{intx,y;};Pointpt[4],bz[11];vectorvpt;boolbDraw;intnInput;voidCaleBZPoints(){添加代码;生成Bezier曲线上的点;}voidCo
5、ntrolPoint(vectorvpt){glPointSize(2);for(inti=0;i6、i(pt[i].x,pt[i].y);}glEnd();}voidmyDisplay(){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,1.0f,1.0f);if(vpt.size()>0){ControlPoint(vpt);}if(bDraw){PolylineGL(pt,4);CaleBZPoints();PolylineGL(bz,11);}glFlush();}voidInit(){glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_SMOOT7、H);printf("PleaseClickleftbuttonofmousetoinputcontrolpointofBezierCurve!");}voidReshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);}voidmouse(intbutton,intstate,intx,inty){s8、witch(button){caseGLUT_LEFT_BUTTON:if(state==GLUT_DOWN){if(nInput==0){pt[0].x=x;pt[0].y=480-y;nInput=1;vpt.cle
6、i(pt[i].x,pt[i].y);}glEnd();}voidmyDisplay(){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,1.0f,1.0f);if(vpt.size()>0){ControlPoint(vpt);}if(bDraw){PolylineGL(pt,4);CaleBZPoints();PolylineGL(bz,11);}glFlush();}voidInit(){glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_SMOOT
7、H);printf("PleaseClickleftbuttonofmousetoinputcontrolpointofBezierCurve!");}voidReshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(0.0,(GLdouble)w,0.0,(GLdouble)h);}voidmouse(intbutton,intstate,intx,inty){s
8、witch(button){caseGLUT_LEFT_BUTTON:if(state==GLUT_DOWN){if(nInput==0){pt[0].x=x;pt[0].y=480-y;nInput=1;vpt.cle
此文档下载收益归作者所有