7.5.5编程实例-Bezier曲线曲面绘制

clip_image003

      (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 }
原文地址:https://www.cnblogs.com/opengl/p/3790463.html