7.5.5编程实例-Bezier曲线曲面绘制
(a)Bezier曲线 (b) Bezier曲面
1. 绘制Bezier曲线
1 #include <GL/glut.h> 2 GLfloat ctrlpoints[4][3] = 3 {{ -4.0, -4.0, 0.0}, { -2.0, 3.0, 0.0}, 4 {2.0, 4.5, 0.0}, {3.0, -3.0, 0.0}}; 5 void init(void) 6 { 7 glClearColor(1.0, 1.0, 1.0, 0.0); 8 glShadeModel(GL_FLAT); 9 //下行用于定义曲线函数 10 glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]); 11 glEnable(GL_MAP1_VERTEX_3); //将当前曲线函数激活 12 } 13 void display(void) 14 { 15 int i; 16 glClear(GL_COLOR_BUFFER_BIT); 17 //下面用求值器按20等分计算Bezier曲线上的点 18 glColor3f(0.0, 0.0, 0.0); 19 glLineWidth(2); 20 glBegin(GL_LINE_STRIP); 21 for (i = 0; i <= 20; i++) 22 glEvalCoord1f((GLfloat) i/20.0); //相当于调用了glVertex*() 23 glEnd(); 24 //下面绘制控制多边形 25 glLineWidth(1); 26 glColor3f(0.0, 0.0, 1.0); 27 glBegin(GL_LINE_STRIP); 28 for (i = 0; i < 4; i++) 29 glVertex3fv(&ctrlpoints[i][0]); 30 glEnd(); 31 glFlush(); 32 } 33 void reshape(int w, int h) 34 { 35 glViewport(0, 0, (GLsizei) w, (GLsizei) h); 36 glMatrixMode(GL_PROJECTION); 37 glLoadIdentity(); 38 if (w <= h) 39 glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0); 40 else 41 glOrtho(-5.0*(GLfloat)w/(GLfloat)h, 5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0); 42 glMatrixMode(GL_MODELVIEW); 43 glLoadIdentity(); 44 } 45 int main(int argc, char** argv) 46 { 47 glutInit(&argc, argv); 48 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB); 49 glutInitWindowSize (500, 500); 50 glutInitWindowPosition (100, 100); 51 glutCreateWindow (argv[0]); 52 init (); 53 glutDisplayFunc(display); 54 glutReshapeFunc(reshape); 55 glutMainLoop(); 56 return 0; 57 }
附上本实验的VC++工程代码(VC++2008)
2. 绘制Bezier曲面(本实验的VC++工程代码(VC++2008))
1 #include <GL/glut.h> 2 GLfloat ctrlpoints[4][4][3] = { 3 {{-3, 0, 4.0}, {-2, 0, 2.0}, {-1, 0, 0.0}, {0, 0, 2.0}}, 4 {{-3, 1, 1.0}, {-2, 1, 3.0}, {-1, 1, 6.0}, {0, 1, -1.0}}, 5 {{-3, 2, 4.0}, {-2, 2, 0.0}, {-1, 2, 3.0}, {0, 2, 4.0}}, 6 {{-3, 3, 0.0}, {-2, 3, 0.0}, {-1, 3, 0.0}, {0, 3, 0.0}} 7 }; 8 void display(void) 9 { 10 int i, j; 11 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 12 glColor3f(0.0, 0.0, 0.0); 13 glPushMatrix (); 14 glRotatef(85.0, 1.0, 1.0, 1.0); 15 for (j = 0; j <= 20; j++) 16 { 17 glBegin(GL_LINE_STRIP); 18 for (i = 0; i <= 20; i++) 19 glEvalCoord2f((GLfloat)i/20.0, (GLfloat)j/20.0); //调用求值器 20 glEnd(); 21 glBegin(GL_LINE_STRIP); 22 for (i = 0; i <= 20; i++) 23 glEvalCoord2f((GLfloat)j/20.0, (GLfloat)i/20.0); //调用求值器 24 glEnd(); 25 } 26 glPopMatrix (); 27 glFlush(); 28 } 29 void init(void) 30 { 31 glClearColor (1.0, 1.0, 1.0, 0.0); 32 //下行的代码用控制点定义Bezier曲面函数 33 glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]); 34 glEnable(GL_MAP2_VERTEX_3); //激活该曲面函数 35 glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0); //构造平行投影矩阵 36 } 37 int main(int argc, char** argv) 38 { 39 glutInit(&argc, argv); 40 glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH); 41 glutInitWindowSize (500, 500); 42 glutInitWindowPosition (100, 100); 43 glutCreateWindow (argv[0]); 44 init (); 45 glutDisplayFunc(display); 46 glutMainLoop(); 47 return 0; 48 }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步