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(); // 强制刷新缓存
}
// 计算贝塞尔曲线上的点坐标 POINT set2Bezier(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; // 计算贝塞尔曲线上的点坐标
pt.y = a0 * p0.y + a1 * p1.y + a2 * p2.y + a3 * p3.y;
return pt;
}
// 绘制二阶贝塞尔曲线的函数 void draw2Bezier(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 = set2Bezier(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);//线1
glVertex2d(p[1].x, p[1].y);//线1
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); // 设置绘制颜色为红色
//glClearColor(1.0, 1.0, 1.0, 1.0);
draw2Bezier(10, 10); // 打印曲线,曲线起点坐标
}
// 主函数,初始化 GLUT 库,设置窗口参数,创建窗口,设置回调函数,进入事件循环 int main(int argc, char** argv) { glutInit(&argc, argv); // 绘图初始化 glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置绘制模式为单缓存和RGB色 glutInitWindowPosition(100, 100);// 设置初始窗口位置 glutInitWindowSize(400, 400); // 设置窗口大小 glutCreateWindow('Lines');// 设置窗口名称 init(); // 初始化 glutDisplayFunc(display); // 回调函数 glutMainLoop(); // 进入事件循环 return 0;
原文地址: http://www.cveoy.top/t/topic/n30j 著作权归作者所有。请勿转载和采集!