zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    InstallShield Limited Edition for Visual Studio 2013 图文教程(教你如何打包.NET程序)
    Java C# MD5 加密串一致性
    1.进入debug模式(基础知识列表)
    wcf 多个节点名出错
    Axis2 java调用.net webservice接口的问题(郑州就维)
    Axis2联接WCF(比较完整的版本)
    未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序解决办法
    C#中OpenFileDialog的使用
    使用OLEDB读取不同版本Excel数据的连接字符串设置
    C#初始化数组的三种方式
  • 原文地址:https://www.cnblogs.com/opengl/p/3790463.html
Copyright © 2011-2022 走看看