1. 実験目的
:ベジェ曲線の定義原理と描画手順を習得する
定義:
ベジェ曲線は、ベジェ曲線またはベジェ曲線とも呼ばれ、2 次元グラフィックス アプリケーションで使用される数学的曲線です。一般的なベクターグラフィックスソフトでは、曲線を正確に描くために使われています ベジェ曲線は線分と節点で構成されています 節点はドラッグできる支点で、線分は伸縮する輪ゴムのようなものです 描画ツールにあるペンツールを使って描画します曲線 この種のベクトル曲線。
2. 実験要件:
OpenGL を使用して 3 次ベジェ曲線を実装し、任意の 4 つの制御点を入力して、対応するベジェ曲線を描画し、マウスで制御点を調整して (ランダムにまたは特定のパターンに沿って変更)、曲線を動的に表示します。
3. 実験コード (部分) は、
最初に Glut ライブラリをインストールする必要があります
#include<GL/glut.h>
#include<GL/GL.h>
#include<math.h>
void mouseClick(int button, int state, int x, int y)
{
if (button == GLUT_LEFT_BUTTON)
{
if (state == GLUT_DOWN) {
if (mask == -1) {
for (int i = 0; i < 4; i++)
{
float mouse_x = (x - 200) / 200.0f, mouse_y = (200 - y) / 200.0f;
float dis = sqrt((mouse_x - ctrl_points[i][0]) * (mouse_x - ctrl_points[i][0]) + (mouse_y - ctrl_points[i][1]) * (mouse_y - ctrl_points[i][1]));
if (dis < 0.1f) mask = i;
}
}
}
else if (state == GLUT_UP)
mask = -1;
}
}
deCateljau アルゴリズム:
C++ では、deCateljau アルゴリズムを使用してベジェ曲線が生成されることがよくあります。このアイデアは、毎回隣接する制御点を横断し、指定されたパラメーター t に従って、2 つの隣接する制御点によって形成される線分上の新しい制御点を選択することです。このようにして、前の制御点を通過するたびに生成される新しい制御点はベジェ曲線に近づき、制御点の数が 1 つ減ります。制御点が 1 つだけ残っている場合、この制御点は次のようになります。ベジェ曲線上の点とみなされます。
void de_Cateljau(int n, GLfloat list[][2])
{
float R_x[4];
float R_y[4];
int k = 0;
for (double t = 0.0; t <= 1; t += 0.1)
{
for (int i = 0; i < n; i++) {
R_x[i] = ctrl_points[i][0];
R_y[i] = ctrl_points[i][1];
}
for (int i = 1; i < n; i++)
{
for (int j = 0; j < n - i; j++)
{
R_x[j] = (1 - t) * R_x[j] + t * R_x[j + 1];
R_y[j] = (1 - t) * R_y[j] + t * R_y[j + 1];
}
}
list[k][0] = R_x[0];
list[k][1] = R_y[0];
k++;
}
}
プロット関数:
void display() {
glClearColor(1.0, 1.0, 1.0, 1.0);//(R,G,B,alpha)自己设置
glClear(GL_COLOR_BUFFER_BIT);//当前可写的颜色缓冲
glPointSize(3);
glColor3f(0.53,0.51,0.78);
for (int i = 0; i < 4; i++) {
glBegin(GL_POINTS);//把每个顶点作为一个点进行处理,顶点n定义了点n,绘制N个点。
glVertex2fv(&ctrl_points[i][0]);
glEnd();
}
glColor3f(0.53,0.51,0.78);
glBegin(GL_LINE_STRIP);//绘制从第一个顶点到最后一个顶点依次相连的一组线段,第n和n+1个顶点定义了线段n,绘制n-1条线段
for (int i = 0; i < 4; i++) {
glVertex2fv(&ctrl_points[i][0]);
}
glEnd();
GLfloat pos_list[11][2] = {
0 };
de_Cateljau(4, pos_list);
glColor3f(1.0, 1.0, 0.0);
glBegin(GL_LINE_STRIP);
for (int i = 0; i < 11; i++) {
glVertex2fv(pos_list[i]);//指定顶点
}
glEnd();
glFlush();//强制刷新缓冲,保证绘图命令将被执行
}
4. 結果サンプル図 任意
の点をドラッグして、ベジェ曲線の形状を変更できます。完全なソース コードを入手するには、ここをクリックしてください。