实验四自由曲线的绘制(OpenGL版)

上传人:新** 文档编号:564773108 上传时间:2024-01-26 格式:DOC 页数:5 大小:44.50KB
返回 下载 相关 举报
实验四自由曲线的绘制(OpenGL版)_第1页
第1页 / 共5页
实验四自由曲线的绘制(OpenGL版)_第2页
第2页 / 共5页
实验四自由曲线的绘制(OpenGL版)_第3页
第3页 / 共5页
实验四自由曲线的绘制(OpenGL版)_第4页
第4页 / 共5页
实验四自由曲线的绘制(OpenGL版)_第5页
第5页 / 共5页
亲,该文档总共5页,全部预览完了,如果喜欢就下载吧!
资源描述

《实验四自由曲线的绘制(OpenGL版)》由会员分享,可在线阅读,更多相关《实验四自由曲线的绘制(OpenGL版)(5页珍藏版)》请在金锄头文库上搜索。

1、南昌大学实验报告四学生姓名:张鑫维学号:6100407234专业班级:计算机072实验类型:验证综合设计创新实验日期:2010-12-3实验成绩:自由曲线的绘制(OpenGL版)1. 实验目的1、掌握Bezier曲线的定义生成算法、离散生成算法;2、掌握B样条曲线的定义生成算法。2. 实验内容假设窗口的宽高分别是600,600个像素单位,定义的裁剪窗口由函数gluOrtho2D(-50.0,50.0,-50.0,50.0)决定。曲线控制点数据:1、已知空间四点P0(-40.0,-40.0,0.0)、P1(-10.0,200.0,0.0)、P2(10.0,-200.0,0.0)、P3(40.0,

2、40.0,0.0),根据Bezier曲线的定义编程绘制曲线。2、已知空间四点P0(-40.0,-40.0,0.0)、P1(-10.0,200.0,0.0)、P2(10.0,-200.0,0.0)、P3(40.0,40.0,0.0),根据Bezier曲线的离散生成算法绘制曲线。3、已知空间四点P0(-40.0,-40.0,0.0)、P1(-10.0,200.0,0.0)、P2(10.0,-200.0,0.0)、P3(40.0,40.0,0.0),根据B样条曲线的定义绘制曲线。3. 实验指导由于几何外形设计的要求越来越高,传统的曲线曲面表示方法,已不能满足用户的需求。1962年,法国雷诺汽车公司的

3、P.E.Bezier构造了一种以逼近为基础的参数曲线和曲面的设计方法,并用这种方法完成了一种称为UNISURF的曲线和曲面设计系统,1972年,该系统被投入了应用。Bezier方法将函数逼近同几何表示结合起来,使得设计师在计算机上就象使用作图工具一样得心应手。4. 实验结果按照定义画出的Bezier曲线(101个点)按照deCasteljai算法画出的Bezier曲线(1001个点)三次Bezier曲线的自由生成确定三次3样条曲线的控制点所有控制点确定后画出样条曲线拖拽第四个控制点,调整曲线5. 实验心得这个实验考查的是自由曲线的绘制,要求熟练掌握好Bezier曲线和B样条曲线的原理和编程。我

4、首先按照实验要求,完成了对已知四个控制点的Bezier曲线生成,采用了定义和deCasteljau两种算法编程。在掌握好Bezier曲线的两种算法后,我尝试着扩展实验,利用鼠标响应函数mouse(),选取用户左击鼠标确定的控制点,在取得了四个控制点后,打印出四个控制点、控制多边形线段以及生成的Bezier曲线。这样可以通过鼠标点击,自由绘制三次Bezier曲线了。B样条曲线的关键是deBoor算法。我之前按照书上的编写了程序,结果四个控制点只打出一个点,而不见曲线。后来老师说书上的有问题,我又参考了他给的资料后才正确完成了程序。后来,我又进一步完善了程序。先是让程序能从鼠标接收任意多个控制点,

5、按照控制点的个数动态算出对应的开放节点矢量,接着调用deBoor算法,算出每段曲线上的点的坐标。随后,我又将橡皮筋技术应用到了该程序,让程序在绘制了曲线后能通过鼠标左键的拖拽控制点实现B样条曲线的调整,进一步提高了程序的可用性。通过这个实验,我不仅深入了解了自由曲线绘制的算法,还熟练了OpenGL编程。特别是鼠标响应函数的处理,让我收获颇大,对交互式的OpenGL编程能力有了很大的提高。y=600.0-y;6. 程序源码floatdeboor(intdegree,floatcoeff,floatknot,floatu,inti)/deboor算法intk,j;floatt1,t2,coeffa

6、30;for(j=i-degree;j=i;j+)coeffaj=coeffj;for(k=1;k=i-degree+k;j-)t1=(float)(knotj+degree-k+1-u)/(knotj+degree-k+1-knotj);t2=1.0-t1;coeffaj=t1*coeffaj-1+t2*coeffaj;returncoeffai;voidbspToPoints(intdegree,intL,floatcoeff,floatknot,intdense,floatpoints,int&pointNum)/控制点生成曲线点坐标inti,j;floatu;pointNum=0;fo

7、r(i=degree;iknoti)for(j=0;jdense;j+)u=knoti+j*(float)(knoti+1-knoti)/dense;pointspointNum+=deboor(degree,coeff,knot,u,i);voidcalKnot(floatknot)/计算节点矢量inti,j,l;for(i=0;i3;i+)knoti=0.0;for(j=0;j=controlNum-3;j+,i+)knoti=j;for(l=0;l3;l+,i+)knoti=j-1;boolisDot(intx,inty)/判断是否为控制点inti;for(i=0;icontrolNum

8、;i+)if(x-Vertex_Xi)*(x-Vertex_Xi)+(y-Vertex_Yi)*(y-Vertex_Yi)=25)controlIndex=i;returntrue;returnfalse;voiddisplayImage(void)/画出包含控制点的B样条曲线inti;glClear(GL_COLOR_BUFFER_BIT);glPointSize(1.0);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glLineStipple(1,0xF0F0);glBegin(GL_LINE_STRIP);for(i=0;icontr

9、olNum;i+)glVertex2f(Vertex_Xi,Vertex_Yi);glEnd();glDisable(GL_LINE_STIPPLE);glColor3f(1.0,1.0,1.0);glBegin(GL_POINTS);for(i=0;ipointNum;i+)glVertex2f(points_xi,points_yi);glEnd();glPointSize(5.0);glColor3f(1.0,1.0,0.0);glBegin(GL_POINTS);for(i=0;icontrolNum;i+)glVertex2f(Vertex_Xi,Vertex_Yi);glEnd()

10、;voiddisplayInit(void)/初始状态下的绘制函数glClear(GL_COLOR_BUFFER_BIT);glFlush();voiddisplayOnDraw(void)/生成曲线过程中的绘制函数inti;glClear(GL_COLOR_BUFFER_BIT);glPointSize(1.0);glColor3f(1.0,0.0,0.0);glEnable(GL_LINE_STIPPLE);glLineStipple(1,0xF0F0);glBegin(GL_LINE_STRIP);for(i=0;icontrolNum;i+)glVertex2f(Vertex_Xi,V

11、ertex_Yi);glEnd();glDisable(GL_LINE_STIPPLE);glPointSize(5.0);glColor3f(1.0,1.0,0.0);glBegin(GL_POINTS);for(i=0;i=4&!isAdjust)isAdjust=true;calKnot(knot);glutDisplayFunc(display);glutPostRedisplay();break;caseGLUT_RIGHT_BUTTON:if(state=GLUT_DOWN)controlNum=0;isAdjust=false;glutDisplayFunc(displayInit);glutPostRedisplay();break;intmain(intargc,char*argv)glutInit(&argc,argv);glutInitDisplayMode(GLUT_RGB);glutInitWindowSize(600,600);glutInitWindowPosition(

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号