实验四 自由曲线曲面算法实验(2).docx_第1页
实验四 自由曲线曲面算法实验(2).docx_第2页
实验四 自由曲线曲面算法实验(2).docx_第3页
实验四 自由曲线曲面算法实验(2).docx_第4页
实验四 自由曲线曲面算法实验(2).docx_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验四 自由曲线曲面算法实验实验项目性质:设计性实验所属课程名称:3D游戏图形学实验计划学时:3学时一、 实验目的和要求1. 了解自由曲线和曲面的生成原理;2. 掌握并实现Bezier曲线和B样条曲线的生成算法;3. 实现Bezier曲面的生成算法。二、 实验原理1. Bezier曲线是通过一组多边形折线的顶点来定义的。如果折线的顶点固定不变,则由其定义的Bezier曲线是唯一的。在折线的各顶点中,只有第一点和最后一点在曲线上且作为曲线的起始处和终止处,其他的点用于控制曲线的形状及阶次。曲线的形状趋向于多边形折线的形状,要修改曲线,只要修改折线的各顶点就可以了。因此,多边形折线又称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样条曲线的次数。参数t的选取取决于B样条结点矢量的选取。是B样条基函数, (4)是结点值,构成了m-1次B样条函数的结点矢量,其中的结点是非减序列,所生成的B样条曲线定义在从结点值到结点值的区间上,而每个基函数定义在t的取值范围内的到的子区间内。从式(3)和(4)可以看出,仅仅给定控制点和参数m还不足以完全表达B样条曲线,还需要给定结点矢量并使用公式(4)来获得基函数。对于三次均匀周期性B样条曲线,m=4,如果用4个控制点来拟合三次曲线,则n=3。假设结点矢量,于是得到基函数计算式为: (5)最终得到该B样条曲线的矩阵形式为 (6)三、 实验内容1下面的代码用来生成三次Bezier曲线,将代码补充完整,编译运行;修改代码,利用OpenGL函数生成三次Bezier曲线。参考代码:#include #include #include #include using namespace std;struct Pointint x, y;Point pt4,bz11;vector vpt;bool bDraw;int nInput;void CaleBZPoints()添加代码;生成Bezier曲线上的点;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;i0)ControlPoint(vpt);if(bDraw)PolylineGL(pt, 4);CaleBZPoints();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_PROJECTION);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();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;glutPostRedisplay();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;2. 改写教材P241程序8-1,实现三次均匀周期性B样条曲线的生成算法,并利用OpenGL函数生成同样的三次周期性B样条曲线。参考代码:#include #include #include class Pt3D public: GLfloat x,y,z;void GetCnk(GLint n, GLint *c) GLint i,k; for(k=0;k=k+1;i-) ck=ck*i; for(i=n-k;i=2;i-) ck=ck/i; void GetPointPr( GLint *c, GLfloat t, Pt3D *Pt, int ControlN, Pt3D *ControlP) GLint k,n=ControlN-1; GLfloat Bernstein; Pt-x=0.0; Pt-y=0.0; Pt-z=0.0; for(k=0; kx += ControlPk.x*Bernstein; Pt-y += ControlPk.y*Bernstein; Pt-z += ControlPk.z*Bernstein; void BezierCurve(GLint m, GLint ControlN, Pt3D *ControlP) GLint *C,i; Pt3D CurvePt; C = new GLintControlN;GetCnk(ControlN-1, C); glBegin (GL_POINTS); for(i=0;im;i+) GetPointPr(C,(GLfloat)i/(GLfloat)m, &CurvePt, ControlN, ControlP); glVertex2f(CurvePt.x, CurvePt.y); glEnd();delete C; void initial(void)glClearColor (1.0, 1.0, 1.0, 0.0);/pNurb=gluNewNurbsRenderer();void Display(void)glClear(GL_COLOR_BUFFER_BIT);GLint ControlN=4,m=500;Pt3D ControlP4=-80.0,-40.0,0.0,-10.0,90.0,0.0,10.0,-90.0,0.0,80.0,40.0,0.0;glColor3f(0.0, 0.0, 0.0);BezierCurve(m,ControlN,ControlP);/gluBeginCurve(pNurb);for(GLint i=0;i4;i+)glVertex3f(ControlPi.x,ControlPi.y,ControlPi.z);glEnd();glFlush();void Reshape(GLint newWidth, GLint newHeight)glViewport(0,0,newWidth,newHeight);glMatrixMode(GL_PROJECTION);glLoadIdentity();gluOrtho2D(-100.0,100.0,-100.0,100.0);void main(void)glutInitDisplayMode(GLUT_SINGLE | GLUT

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论