Bezier曲线的绘制

#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); //平移图形
	//四个点作为控制顶点
	Point[0].x = 0.0;
	Point[0].y = 0.0;
	Point[1].x = 100.0;
	Point[1].y = 200.0;
	Point[2].x = 200.0;
	Point[2].y = 100.0;
	Point[3].x = 400.0;
	Point[3].y = 0.0;
	glColor3f(0.0, 0.0, 1.0); //设置线条颜色
	glPointSize(5); //设置点的大小
	//通过正常途径进行相关的绘画
	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); //设置点的大小
	//使用运用三次Bezier曲线来绘制相关的图形
	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("使用OpenGlBezier曲线");
	init();
	glutDisplayFunc(&Bernstain);
	glutMainLoop();
	return 0;
}

实现效果:

 

猜你喜欢

转载自blog.csdn.net/qq_38345598/article/details/84989220