OPENGL绘制贝塞尔曲线

最终效果图:

通过3个点形成一条贝塞尔曲线

这里写图片描述

1. 鼠标问题

在使用鼠标获取坐标的时候,要知道鼠标获取的坐标和屏幕坐标是不同的;

openGL使用右手坐标
从左到右,x递增
从下到上,y递增
从远到近,z递增

而鼠标是从左到右增x,同时从上到下也是增y

所以在求 y 的时候,用(屏幕大小-y)来获取

2. 绘制

setpoint 用来绘制点
setline 用来绘制线
setBezier 用来绘制贝塞尔曲线

其中公式的意义可以参考百科:

这里写图片描述

实际绘制的时候就是不断的增加t,求出下一点的值然后将两个链接起来,然后再将下一个点作为起点,再求出下下一个点


Api解释在代码中
 #include "GL\glut.h"
#include <math.h>
#include <Windows.h>

//这是一个点的类,用于存储其中点的坐标
class Point
{
public:
    int x, y;
    void setxy(int _x, int _y) {
        x = _x;
        y = _y;
    }
};

//点的数量
static int POINTSNUM = 
  • 16
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
以下是OpenGL绘制三次贝塞尔曲线的示例代码: ```c++ #include <GL/glut.h> #include <math.h> double points[4][2] = { {-0.5, 0}, {-0.25, 0.5}, {0.25, -0.5}, {0.5, 0} }; void drawBezierCurve() { glColor3f(1.0, 0.0, 0.0); // 设置颜色为红色 glLineWidth(3.0); // 设置线宽为3 glBegin(GL_LINE_STRIP); // 开始绘制线段 for (double t = 0.0; t <= 1.0; t += 0.01) { double x = pow(1 - t, 3) * points[0][0] + 3 * t * pow(1 - t, 2) * points[1][0] + 3 * pow(t, 2) * (1 - t) * points[2][0] + pow(t, 3) * points[3][0]; double y = pow(1 - t, 3) * points[0][1] + 3 * t * pow(1 - t, 2) * points[1][1] + 3 * pow(t, 2) * (1 - t) * points[2][1] + pow(t, 3) * points[3][1]; glVertex2d(x, y); // 添加点到线段中 } glEnd(); // 结束绘制线段 } void display() { glClear(GL_COLOR_BUFFER_BIT); // 清空颜色缓冲区 drawBezierCurve(); // 绘制贝塞尔曲线 glFlush(); // 刷新缓冲区 } void init() { glClearColor(1.0, 1.0, 1.0, 0.0); // 设置背景色为白色 glMatrixMode(GL_PROJECTION); // 设置投影矩阵 glLoadIdentity(); gluOrtho2D(-1.0, 1.0, -1.0, 1.0); // 设置视口大小 } int main(int argc, char** argv) { glutInit(&argc, argv); // 初始化glut glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB); // 设置显示模式 glutInitWindowSize(500, 500); // 设置窗口大小 glutInitWindowPosition(100, 100); // 设置窗口位置 glutCreateWindow("Bezier Curve"); // 创建窗口并命名 init(); // 初始化OpenGL glutDisplayFunc(display); // 设置显示回调函数 glutMainLoop(); // 进入主循环 return 0; } ``` 该代码使用OpenGL绘制了一个三次贝塞尔曲线,其中使用了`glBegin`和`glEnd`函数绘制线段,并使用`glVertex2d`函数添加点到线段中。在`drawBezierCurve`函数中,根据贝塞尔曲线的公式计算出每个$t$值对应的$x$和$y$,并添加到线段中。通过调用`glutMainLoop`函数进入主循环,可以让程序一直运行,直到用户关闭窗口。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值