【问题标题】:B-Splines in C++C++ 中的 B 样条曲线
【发布时间】:2017-03-04 17:30:21
【问题描述】:

我正在尝试编写一个程序以在 C++ 中生成曲线以绘制 B 样条曲线。这就是我的代码的样子。

void drawBSplineCurve(vector<point> poly)
{
    int n, d;
    cout << "Enter degree of curve: ";
    cin >> d;
    n = poly.size();
    vector<double> uVec;
    int i;
    for(i=0;i<n+d;i++)
    {
        uVec.push_back(((double)i)/(n+d-1));
    }
    double x, y, basis, u;
    for(u=0;u<=1;u+=0.0001)
    {
        x = 0;
        y = 0;
        for(i=0;i<poly.size();i++)
        {
            basis = blend(uVec, u, i, d);
            x += basis*poly[i].x;
            y += basis*poly[i].y;
        }
        putpixel(roundOff(x), roundOff(y), YELLOW);
    }
}

double blend(vector<double> &uVec, double u, int k, int d)
{
    if(d==1)
    {
        if(uVec[k]<=u && u<uVec[k+1])
            return 1;
        return 0;
    }
    double b;
    b = ((u-uVec[k])/(uVec[k+d-1]-uVec[k])*blend(uVec, u, k, d-1)) + ((uVec[k+d]-u)/(uVec[k+d]-uVec[k+1])*blend(uVec, u, k+1, d-1));
    return b;
}

但是,正如您从我的输出中看到的那样,由于某种原因,曲线倾向于在原点开始和结束(y 轴是倒置的)。对此原因的任何帮助将不胜感激。谢谢:D

【问题讨论】:

  • 你使用哪个图形库?
  • 这是旧的graphics.h。可悲的是,我们被教导在大学里使用它。
  • 我认为您的uvec 是错误的。它不应该在开头和结尾有重复的值吗?此外,请注意blend() 中的除零。
  • @NicoSchertler 为什么我的uVec 应该有重复值?另外,除以零不会使我的程序崩溃,因为我没有处理异常吗?
  • @naman1901 - 太棒了!当然,不是花费的时间——而是你能够自我回答的事实。学习思维的更好形式之一,太棒了!

标签: c++ graphics bspline bgi


【解决方案1】:

因此,在投入了比我应有的更多时间之后,我终于在我的课本中我错过的一行中找到了答案。显然,该曲线仅针对 uVec[d-1] 和 uVec[n] 之间的 u 值定义。

这意味着错误在函数“混合”中 条件 (uVec[k]

【讨论】:

    【解决方案2】:

    因此,在投入了比我应有的更多时间之后,我终于在我的课本中我错过的一行中找到了答案。显然,该曲线仅针对uVec[d-1]uVec[n] 之间的u 值定义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-12-16
      • 2013-06-07
      • 1970-01-01
      • 2023-02-13
      • 1970-01-01
      相关资源
      最近更新 更多