贝塞尔曲线
贝塞尔曲线 就是一个公式,通过这个公式获取曲线上的点,从而连接成曲线。
二次贝塞尔曲线,有起始点、终点、加上一个控制点,一个控制点控制曲线形状。
三次贝塞尔曲线,有起始点、终点、加上两个控制点,两个控制点控制曲线形状 。
代码如下:
//顶点数据 包含 位置
struct Vertex {
float x, y, z;
};
Vertex _line[360];
// 绘制三次贝塞尔曲线
static void render(GLFWwindow * window) {
glClearColor(0, 0, 0, 1);
glClear(GL_COLOR_BUFFER_BIT);
glEnable(GL_LINE_SMOOTH); //开启线的反锯齿
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); //设置反锯齿算法
glEnable(GL_BLEND); // 启用alpha混合 (反锯齿)
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //设置混合参数
glLineWidth(2); //设置线的宽度
Vertex p0 ={ 10, 10, 0 };
Vertex p1 ={ 100, 100, 0 };
Vertex p2 ={ 200, 10, 0 };
Vertex p3 ={ 300, 150, 0 };
int indx = 0;
for(float t = 0; t < 1.0f; t += 0.01f, ++indx) {
// 下面顶点是通过贝塞尔曲线公式计算
_line[indx].x = (1 - t) * (1 - t) * (1 - t) * p0.x + 3 * t * (1 - t) * (1 - t)* p1.x + 3 * t*t* (1 - t)* p2.x + t * t * t * p3.x;
_line[indx].y = (1 - t) * (1 - t) * (1 - t) * p0.y + 3 * t * (1 - t) * (1 - t)* p1.y + 3 * t*t* (1 - t)* p2.y + t * t * t * p3.y;
_line[indx].z = 0;
}
glEnableClientState(GL_VERTEX_ARRAY);
glVertexPointer(3, GL_FLOAT, sizeof(Vertex), _line);
glDrawArrays(GL_LINE_STRIP, 0, indx - 1);
glfwSwapBuffers(window);
glfwPollEvents();
}