在OpenGL / C ++中加入B-Spline段

时间:2017-02-21 23:29:01

标签: c++ opengl freeglut bspline

我尝试绘制一个给定11个控制点的B样条曲线。我使用的是freeglut和C ++。 我能够轻松地显示我的控制点。然后我写了基本函数如下:

float B0(float u){
    return  float(pow(u - 1, 3) / 6.0);
}

float B1(float u){
    return float((3 * pow(u, 3) - 6 * pow(u, 2) + 4) / 6.0);
}

float B2(float u){
    return float((-3 * pow(u, 3) + 3 * pow(u, 2) + 3 * u + 1) / 6.0);
}

float B3(float u){
    return float(pow(u, 3) / 6.0);
}

这是我的算法,它计算每个段100个点并将计算的点存储在要显示的数组中,注意MAX_POINTS是全局的,并且points是具有浮点数x,y和的浮点数的结构数组每个z:

void computeBSpline(){
int MAX_STEPS = 100;
int count = 0;
for (int i = 0; i < NUM_OF_POINTS - 3; i++)
{
    cout << "Computing for P" << i << " P " << i + 1 << " P " << i + 2 << " P " << i + 3 << endl;
    for (int j = 0; j <= MAX_STEPS; j++)
    {

        float u = float(j) / float(MAX_STEPS);

        float Qx = B0(u) * points[i].x + B1(u) * points[i + 1].x + B2(u) * points[i + 2].x + B3(u) * points[i + 3].x;
        float Qy = B0(u) * points[i].y + B1(u) * points[i + 1].y + B2(u) * points[i + 2].y + B3(u) * points[i + 3].y;

        pointsBSpline[count].x = Qx;
        pointsBSpline[count].y = Qy;

        //cout << count << '(' << Qx << ", " << Qy << ")\n";
        count++;
    }
}
cout << "Computed " << count << " points!\n";
}

我后来称之为DrawBSpline(),它将遍历数组并显示所有点:

void DrawBSpline(){
glPointSize(1.5);
glColor3d(0.0, 0.0, 0.0);
int i = 0;
glBegin(GL_POINTS);
for (; i < NUM_OF_BSPLINE_POINTS; i++){
    glVertex2d(pointsBSpline[i].x, pointsBSpline[i].y);
}
glEnd();
}

这是我程序的输出: B-Spline output

我只是不确定如何加入细分并产生一条平滑的曲线。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

原来我写道     float(pow(u-1, 3) / 6.0); 代替     float(pow(1-u, 3) / 6.0);

我很尴尬,问题已解决。