利用OpenGL函数,画出n次Bezier曲线
时间: 2024-06-09 08:07:01 浏览: 10
绘制n次Bezier曲线,需要以下步骤:
1. 定义n+1个控制点P0、P1、P2、...、Pn。
2. 将Bezier曲线分解为若干个小段,每段用多项式表示。
3. 在每个小段上取足够多的点,用OpenGL函数绘制出曲线。
下面是代码示例:
```
#include <GL/glut.h>
#include <vector>
using namespace std;
// 控制点
vector<GLfloat> controlPoints = {
// x, y
100, 100,
200, 300,
400, 300,
500, 100
};
// 递归计算Bezier曲线点
void computeBezierPoint(GLfloat u, GLfloat *point, int n) {
if (n == 0) {
point[0] = controlPoints[0];
point[1] = controlPoints[1];
return;
}
GLfloat *tempPoints = new GLfloat[n * 2];
for (int i = 0; i < n; i++) {
tempPoints[i * 2] = controlPoints[i * 2] * (1 - u) + controlPoints[i * 2 + 2] * u;
tempPoints[i * 2 + 1] = controlPoints[i * 2 + 1] * (1 - u) + controlPoints[i * 2 + 3] * u;
}
computeBezierPoint(u, point, n - 1);
point[0] = tempPoints[0] * (1 - u) + point[0] * u;
point[1] = tempPoints[1] * (1 - u) + point[1] * u;
delete[] tempPoints;
}
// 绘制Bezier曲线
void drawBezierCurve(int n) {
GLfloat point[2];
glBegin(GL_LINE_STRIP);
for (int i = 0; i <= 100; i++) {
GLfloat u = (GLfloat)i / 100.0f;
computeBezierPoint(u, point, n);
glVertex2fv(point);
}
glEnd();
}
// 绘制函数
void display() {
glClear(GL_COLOR_BUFFER_BIT);
// 绘制控制点
glColor3f(1.0f, 0.0f, 0.0f);
glPointSize(5.0f);
glBegin(GL_POINTS);
for (int i = 0; i < controlPoints.size(); i += 2) {
glVertex2f(controlPoints[i], controlPoints[i + 1]);
}
glEnd();
// 绘制Bezier曲线
glColor3f(0.0f, 0.0f, 1.0f);
drawBezierCurve(controlPoints.size() / 2 - 1);
glFlush();
}
// 初始化函数
void init() {
glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(0.0, 600.0, 0.0, 400.0);
}
int main(int argc, char *argv[]) {
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(600, 400);
glutInitWindowPosition(100, 100);
glutCreateWindow("Bezier Curve");
init();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
```
这段代码实现了一个简单的Bezier曲线绘制程序,其中控制点可以自由设置。在`computeBezierPoint`函数中,通过递归计算Bezier曲线上的点。在`drawBezierCurve`函数中,将Bezier曲线分成若干个小段,然后在每个小段上取100个点,用OpenGL函数绘制出曲线。最终效果如下图所示:
![Bezier曲线绘制效果图](https://img-blog.csdn.net/20180408115321527?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ2hpdEdQVA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/q/85#pic_center)
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![-](https://csdnimg.cn/download_wenku/file_type_column_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)