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

clip_image003

      (a)Bezier曲线                         (b) Bezier曲面

1. 绘制Bezier曲线

#include <GL/glut.h>

GLfloat ctrlpoints[4][3] =

{{ -4.0, -4.0, 0.0}, { -2.0, 3.0, 0.0},

{2.0, 4.5, 0.0}, {3.0, -3.0, 0.0}};

void init(void)

{

glClearColor(1.0, 1.0, 1.0, 0.0);

glShadeModel(GL_FLAT);

//下行用于定义曲线函数

glMap1f(GL_MAP1_VERTEX_3, 0.0, 1.0, 3, 4, &ctrlpoints[0][0]);

glEnable(GL_MAP1_VERTEX_3); //将当前曲线函数激活

}

void display(void)

{

int i;

glClear(GL_COLOR_BUFFER_BIT);

//下面用求值器按20等分计算Bezier曲线上的点

glColor3f(0.0, 0.0, 0.0);

glLineWidth(2);

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 20; i++)

glEvalCoord1f((GLfloat) i/20.0); //相当于调用了glVertex*()

glEnd();

//下面绘制控制多边形

glLineWidth(1);

glColor3f(0.0, 0.0, 1.0);

glBegin(GL_LINE_STRIP);

for (i = 0; i < 4; i++)

glVertex3fv(&ctrlpoints[i][0]);

glEnd();

glFlush();

}

void reshape(int w, int h)

{

glViewport(0, 0, (GLsizei) w, (GLsizei) h);

glMatrixMode(GL_PROJECTION);

glLoadIdentity();

if (w <= h)

glOrtho(-5.0, 5.0, -5.0*(GLfloat)h/(GLfloat)w, 5.0*(GLfloat)h/(GLfloat)w, -5.0, 5.0);

else

glOrtho(-5.0*(GLfloat)w/(GLfloat)h, 5.0*(GLfloat)w/(GLfloat)h, -5.0, 5.0, -5.0, 5.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity();

}

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow (argv[0]);

init ();

glutDisplayFunc(display);

glutReshapeFunc(reshape);

glutMainLoop();

return 0;

}

 

2. 绘制Bezier曲面

#include <GL/glut.h>

GLfloat ctrlpoints[4][4][3] = {

{{-3, 0, 4.0}, {-2, 0, 2.0}, {-1, 0, 0.0}, {0, 0, 2.0}},

{{-3, 1, 1.0}, {-2, 1, 3.0}, {-1, 1, 6.0}, {0, 1, -1.0}},

{{-3, 2, 4.0}, {-2, 2, 0.0}, {-1, 2, 3.0}, {0, 2, 4.0}},

{{-3, 3, 0.0}, {-2, 3, 0.0}, {-1, 3, 0.0}, {0, 3, 0.0}}

};

void display(void)

{

int i, j;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glColor3f(0.0, 0.0, 0.0);

glPushMatrix ();

glRotatef(85.0, 1.0, 1.0, 1.0);

for (j = 0; j <= 20; j++)

{

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 20; i++)

glEvalCoord2f((GLfloat)i/20.0, (GLfloat)j/20.0); //调用求值器

glEnd();

glBegin(GL_LINE_STRIP);

for (i = 0; i <= 20; i++)

glEvalCoord2f((GLfloat)j/20.0, (GLfloat)i/20.0); //调用求值器

glEnd();

}

glPopMatrix ();

glFlush();

}

void init(void)

{

glClearColor (1.0, 1.0, 1.0, 0.0);

//下行的代码用控制点定义Bezier曲面函数

glMap2f(GL_MAP2_VERTEX_3, 0, 1, 3, 4, 0, 1, 12, 4, &ctrlpoints[0][0][0]);

glEnable(GL_MAP2_VERTEX_3); //激活该曲面函数

glOrtho(-5.0, 5.0, -5.0, 5.0, -5.0, 5.0); //构造平行投影矩阵

}

int main(int argc, char** argv)

{

glutInit(&argc, argv);

glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB | GLUT_DEPTH);

glutInitWindowSize (500, 500);

glutInitWindowPosition (100, 100);

glutCreateWindow (argv[0]);

init ();

glutDisplayFunc(display);

glutMainLoop();

return 0;

}

  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

图形空间

文章不错,赞赏鼓励

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值