C++ OpenGL 实现贝塞尔曲线绘制:代码详解及注释
#include
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(); // 立即执行OpenGL命令
}
POINT set2Bezier(POINT p0, POINT p1, POINT p2, float t) { POINT pt; float a0 = (1 - t) * (1 - t); // 计算系数a0 float a1 = 2 * (1 - t) * t; // 计算系数a1 float a2 = t * t; // 计算系数a2
pt.x = a0 * p0.x + a1 * p1.x + a2 * p2.x; // 计算Bezier曲线上的点的x坐标
pt.y = a0 * p0.y + a1 * p1.y + a2 * p2.y; // 计算Bezier曲线上的点的y坐标
return pt;
}
void draw2Bezier(float X, float Y) { POINT p[3]; p[0].x = X + 0; p[0].y = Y + 0; // 设置起点坐标 p[1].x = X + 30; p[1].y = Y + 30; // 设置控制点坐标 p[2].x = X + 100; p[2].y = Y + 20; // 设置终点坐标
POINT pt;
for (float t = 0; t <= 1; t += 0.01) { // 在[0,1]区间内以0.01为步长逐一计算Bezier曲线上的点
pt = set2Bezier(p[0], p[1], p[2], t);
setPoints(pt); // 绘制Bezier曲线上的点
}
glColor3f(1.0, 1.0, 1.0); // 设置线段颜色为白色
glBegin(GL_LINES); // 开始绘制线段
glVertex2d(p[0].x, p[0].y);//线1
glVertex2d(p[1].x, p[1].y);//线1
glVertex2d(p[1].x, p[1].y);
glVertex2d(p[2].x, p[2].y); // 绘制Bezier曲线的控制多边形
glEnd(); // 结束绘制
glFlush(); // 立即执行OpenGL命令
}
void display() { glClear(GL_PROJECTION); // 清除投影矩阵的缓存
glColor3f(1.0, 0, 0); // 设置颜色为红色
draw2Bezier(0, 0); //打印曲线,曲线起点坐标为(0,0)
}
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; }
// 代码的具体思想为:通过Bezier曲线的控制点计算Bezier曲线上的点,并在OpenGL中绘制出Bezier曲线和控制多边形。具体实现方法为先通过set2Bezier函数计算Bezier曲线上的点,再通过setPoints函数在OpenGL中绘制出曲线上的点,最后通过glBegin和glEnd函数在OpenGL中绘制出Bezier曲线和控制多边形。在main函数中使用glut库进行窗口的初始化和事件循环的处理,通过display函数进行绘图。
原文地址: https://www.cveoy.top/t/topic/n38X 著作权归作者所有。请勿转载和采集!