#include #include <gl/glut.h> // 引入 OpenGL 和 GLUT 库

using namespace std;

typedef struct point { // 定义一个结构体,用来表示点的坐标 float x; float y; } POINT;

void init() { glClearColor(1.0, 1.0, 1.0, 1.0); // 设置背景颜色为白色 glMatrixMode(GL_PROJECTION); // 设置矩阵模式为投影模式 glLoadIdentity(); // 将当前矩阵重置为单位矩阵 gluOrtho2D(0.0, 200.0, 0.0, 150.0); // 设置二维正交投影 }

void setPoints(POINT v) { // 设置函数用于绘制点 glBegin(GL_POINTS); // 开始绘制点

glVertex2f(v.x, v.y);  // 绘制点的坐标

glEnd();  // 结束绘制
glFinish();  // 渲染所有绘制图形

}

POINT set3Bezier(POINT p0, POINT p1, POINT p2, POINT p3, float t) { // 计算二次贝塞尔曲线上的点 POINT pt; float a0 = (1 - t) * (1 - t) * (1 - t); float a1 = 3 * t * (1 - t) * (1 - t); float a2 = 3 * t * t * (1 - t); float a3 = t * t * t;

pt.x = a0 * p0.x + a1 * p1.x + a2 * p2.x + a3 * p3.x;  // 计算 x 坐标
pt.y = a0 * p0.y + a1 * p1.y + a2 * p2.y + a3 * p3.y;  // 计算 y 坐标

return pt;  // 返回计算出的点的坐标

}

void draw3Bezier(float X, float Y) {
POINT p[4];
p[0].x = X + 30; p[0].y = Y + 50; // 第一个点的坐标 p[1].x = X + 10; p[1].y = Y + 30; // 第二个点的坐标 p[2].x = X + 100; p[2].y = Y + 70; // 第三个点的坐标 p[3].x = X + 150; p[3].y = Y + 30; // 第四个点的坐标

POINT pt;
for (float t = 0; t <= 1; t += 0.01) {  
	pt = set3Bezier(p[0], p[1], p[2], p[3], t);
	setPoints(pt);
}

glColor3f(1.0, 1.0, 1.0);  // 设置颜色为白色
glBegin(GL_LINES);  // 开始绘制线段

glVertex2d(p[0].x, p[0].y);  // 绘制线段的起点
glVertex2d(p[1].x, p[1].y);  // 绘制线段的终点

glVertex2d(p[1].x, p[1].y);  // 绘制线段的起点
glVertex2d(p[2].x, p[2].y);  // 绘制线段的终点

glVertex2d(p[2].x, p[2].y);  // 绘制线段的起点
glVertex2d(p[3].x, p[3].y);  // 绘制线段的终点

glEnd();  // 结束绘制线段
glFlush();  // 渲染所有绘制图形

}

void display() { glClear(GL_PROJECTION); // 清空投影矩阵

glColor3f(1.0, 0, 0);  // 设置颜色为红色
draw3Bezier(10, 10);  

}

int main(int argc, char** argv) { glutInit(&argc, argv); // 初始化 GLUT 库 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式为单缓存、RGB 色 glutInitWindowPosition(100, 100); // 设置窗口的初始位置 glutInitWindowSize(400, 400); // 设置窗口大小 glutCreateWindow('Lines'); // 创建窗口并设置窗口名称 init(); // 初始化绘图环境 glutDisplayFunc(display); // 设置回调函数 glutMainLoop(); // 进入主循环,等待用户交互 return 0; }

是的,这个代码绘制的是三次贝塞尔曲线。可以看到在 set3Bezier 函数中使用了四个点来计算曲线上的点,这就是三次贝塞尔曲线的特征之一。

该代码使用四个控制点 (p0, p1, p2, p3) 来绘制三次贝塞尔曲线。'set3Bezier' 函数使用贝塞尔曲线方程来计算曲线上的每个点,并根据这些点绘制出曲线。

贝塞尔曲线在计算机图形学中非常有用,因为它允许创建平滑的曲线,而无需使用大量数据点。

你可以修改代码中的控制点坐标来创建不同的贝塞尔曲线。

C++ OpenGL 绘制三次贝塞尔曲线代码

原文地址: https://www.cveoy.top/t/topic/n31V 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录