计算机图形学-基于OpenGL的绘制Bezier曲线

计算机图形学-基于OpenGL的绘制Bezier曲线

本实验集成开发环境为vs2013,基于OpenGL。

实验内容

根据Bezier曲线的定义,绘制Bezier曲线段。自己编程实现Bernstain基函数,然后在曲线上采集200个点,连成拆线段绘制。

预备知识

  • P(t)=i=0nPiBi,n(t),t[0,1]
  • 其中,
    Bi,n(t)=Ctn(1t)ni

实验代码

#include <GL/glut.h>
#include <cstdio>
#include <cmath>

const GLfloat Pi = 3.1415926536f;

//定义点集
struct data{
    GLfloat x;
    GLfloat y;
}Point[4];

void init()  //初始化函数
{
    glClearColor(1.0, 1.0, 1.0, 0.0); //设置背景颜色
    glMatrixMode(GL_PROJECTION);       // 设置投影参数
    gluOrtho2D(0.0, 100.0, 0.0, 100.0); // 设置场景的大小
}

void Bernstain()  //Bernstain基函数
{

    glClear(GL_COLOR_BUFFER_BIT);

    glTranslatef(10.0f, 10.0f, 0.0f); //平移图形
    glScalef(0.1f, 0.1f, 0.1f); //缩小图像0.5倍
    //glRotatef(60.0f, 1.0f, 0.0f, 0.0f); //沿x轴旋转60度

    //四个点作为控制顶点
    Point[0].x = 0.0;
    Point[0].y = 0.0;
    Point[1].x = 200.0;
    Point[1].y = 100.0;
    Point[2].x = 300.0;
    Point[2].y = 100.0;
    Point[3].x = 400.0;
    Point[3].y = 0.0;

    glColor3f(0.0, 0.0, 1.0); //设置线条颜色
    glPointSize(2); //设置点的大小

    glBegin(GL_LINES);
        glVertex2f(Point[0].x, Point[0].y);
        glVertex2f(Point[1].x, Point[1].y);
        glVertex2f(Point[1].x, Point[1].y);
        glVertex2f(Point[2].x, Point[2].y);
        glVertex2f(Point[2].x, Point[2].y);
        glVertex2f(Point[3].x, Point[3].y);
    glEnd();
    glFlush();

    glColor3f(1.0, 0.0, 0.0); //设置线条颜色
    glPointSize(2); //设置点的大小

    glBegin(GL_LINE_STRIP);
    for (int i = 1; i <= 200; i++)
    {
        GLfloat t = i / 200.0;
        GLfloat b0 = pow(1 - t, 3.0);
        GLfloat b1 = 3.0 * t*pow(1 - t, 2.0);
        GLfloat b2 = 3.0 * t*t*(1 - t);
        GLfloat b3 = t*t*t;
        //运用三次Bezier曲线
        GLfloat x = Point[0].x*b0 + Point[1].x*b1 + Point[2].x*b2 + Point[3].x*b3;
        GLfloat y = Point[0].y*b0 + Point[1].y*b1 + Point[2].y*b2 + Point[3].y*b3;

        glVertex2f(x, y);
    }
    glEnd();
    glFlush();
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(100, 100);
    glutInitWindowSize(400,400);
    glutCreateWindow("Bezier曲线");
    init();
    glutDisplayFunc(&Bernstain);
    glutMainLoop();
    return 0;
}

效果预览

Bezier1

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值