实验10 Bezier曲线生成-实验提高-控制点生成B样条曲线
本代码根据已知控制点( 10, 5, 0 ),( 5, 10, 0 ),( -5, 15, 0 ),( -10, -5, 0 ),( 4, -4, 0 ),( 10, 5, 0 ), ( 5, 10, 0 ), ( -5, 15, 0 ), ( -10, -5, 0 )( 10, 5, 0 )来生成三次B样条曲线。#includeGL/glut.h#includestdio.h#includestdlib.h#includevectorusingnamespacestd;structPoint{floatc[2];floatxc[0];floatyc[1];Point(){x0,y0;}Point(floatx0,floaty0){xx0,yy0;}Point(constPointpt){xpt.x,ypt.y;}floatoperator[](constinti){returnc[i];}};vectorPointGctrlPt,GbsCurvePt;intGnumSegment10;voidCalcBSPoints(){intnumCtrPtGctrlPt.size();floatF0[2],F1[2],F2[2],F3[2];floatt0;floatdt1/(float)GnumSegment;//第一段NumSubSegment 1个点第二段之后每段为NumSubSegment个点,因为第二段之后的起点为前一段的终点intnumCurvePoint(GnumSegment1)GnumSegment*(numCtrPt-4);GbsCurvePt.resize(numCurvePoint);//第一段起点编号为0第二段之后的为1原因见上for(inti0;i(numCtrPt-3);i){for(intj0;j2;j){F0[j](GctrlPt[i][j]4*GctrlPt[1i][j]GctrlPt[2i][j])/6.0f;F1[j](-3*GctrlPt[i][j]3*GctrlPt[2i][j])/6.0f;F2[j](3*GctrlPt[i][j]-6*GctrlPt[1i][j]3*GctrlPt[2i][j])/6.0f;F3[j](-GctrlPt[i][j]3*GctrlPt[1i][j]-3*GctrlPt[2i][j]GctrlPt[3i][j])/6.0f;}t(i0)?0:dt;//第一段起点参数为0第二段之后的为dt原因同上for(intj(i0)?0:1;jGnumSegment1;j){for(intk0;k2;k){GbsCurvePt[jGnumSegment*i][k]F0[k]F1[k]*tF2[k]*t*tF3[k]*t*t*t;}tdt;}}}voidControlPoint(constvectorPointvpt){glPointSize(3);glBegin(GL_POINTS);for(unsignedinti0;ivpt.size();i){glVertex2f(vpt[i].x,vpt[i].y);}glEnd();}voidPolylineGL(constvectorPointvpt){glBegin(GL_LINE_STRIP);for(unsignedinti0;ivpt.size();i){glVertex2f(vpt[i].x,vpt[i].y);}glEnd();}voidmyDisplay(){glClear(GL_COLOR_BUFFER_BIT);glColor3f(1.0f,0.0f,0.0f);ControlPoint(GctrlPt);glColor3f(0.0f,1.0f,0.0f);PolylineGL(GctrlPt);if(GctrlPt.size()4){glColor3f(1.0f,1.0f,1.0f);CalcBSPoints();PolylineGL(GbsCurvePt);}glFlush();}voidInit(){glClearColor(0.0,0.0,0.0,0.0);glShadeModel(GL_SMOOTH);floatpoints[9][3]{{10,5,0},{5,10,0},{-5,15,0},{-10,-5,0},{4,-4,0},{10,5,0},{5,10,0},{-5,15,0},{-10,-5,0}};Point pt;for(inti0;i9;i){Point ptPoint(points[i][0],points[i][1]);GctrlPt.push_back(pt);}}voidmyReshape(intw,inth){glViewport(0,0,(GLsizei)w,(GLsizei)h);glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho(-30.0,30.0,-30.0*(GLfloat)h/(GLfloat)w,30.0*(GLfloat)h/(GLfloat)w,0.0,100.0);}intmain(intargc,char*argv[]){glutInit(argc,argv);glutInitDisplayMode(GLUT_RGB|GLUT_SINGLE);glutInitWindowPosition(100,100);glutInitWindowSize(640,480);glutCreateWindow(B-Spline Curve);Init();glutDisplayFunc(myDisplay);glutReshapeFunc(myReshape);glutMainLoop();return0;}