【问题标题】:Joining B-Spline segments in OpenGL / C++在 OpenGL / C++ 中加入 B 样条线段
【发布时间】:2017-02-21 23:29:01
【问题描述】:

我正在尝试在给定 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 是全局的,点是一个结构数组,每个结构都有浮点数 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

我只是不确定如何连接这些段并产生一条平滑曲线。任何帮助将不胜感激。

【问题讨论】:

  • 嗯,加入细分的一种方法是使用左侧和右侧的加权平均值。 (我假设您不只是在寻找 GL_LINE_STRIP 而不是 GL_POINTS
  • 是的,我正在寻找一种使其成为平滑曲线的方法,某些计算点不应显示,因为它们不会落在曲线上。我知道GL_LINE_STRIP 的用法,但这只会将它们连接起来,但是我不确定如何执行您所描述的操作。
  • 从最近点为 (x1, y1) 和 (x2, y2) 的表中考虑(所谓的线性但实际上是 仿射)插值:@987654329 @。现在使用它在两条曲线而不是两个常数之间进行平滑插值:h(x) = (f(x) * (x2 - x) + g(x) * (x - x1)) / (x2 - x1) 由于您的曲线已参数化,您可以使用 u 来控制混合。
  • 但我认为你的样条构造有问题,它应该是控制点的加权平均值,随处平滑变化
  • 我正在使用以下公式:i.imgur.com/aGFJCVq.jpg,由我的班级教师提供,然后我对每个点的 x 和 y 进行总结。我的代码有错误吗?

标签: c++ opengl freeglut bspline


【解决方案1】:

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

我很尴尬,问题已解决。

【讨论】:

  • 这种事情肯定会做到——你会有一个基函数趋向于 -1/6,而它的邻居达到 +1/6
猜你喜欢
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-16
  • 2014-06-07
相关资源
最近更新 更多