(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 }