B样条算法

B-spline algorithm

我有绘制贝塞尔曲线的代码。是否可以修改此代码以绘制 B 样条曲线?

这是我使用 DeCasteljau 算法的代码:

    private Point getPoint(int r, int i, double t)
    {
        if (r == 0) return points[i];

        Point p1 = getPoint(r - 1, i, t);
        Point p2 = getPoint(r - 1, i + 1, t);

        return new Point((int)((1 - t) * p1.X + t * p2.X), (int)((1 - t) * p1.Y + t * p2.Y));
    }

我找到了这段用于 B 样条曲线的代码。它看起来与我的代码相似,但我有 XY 点并且只有数字。我不知道如何修改我的代码。我尝试了一些但它不起作用。

private double BasisFunction(int k, int i, ParameterCollection u, double t){
if(k==0)
 {
  if((u[i]<=t) && (t<=u[i+1]))
   return 1;
  else
   return 0;
 }
 else
{
 double memb1, memb2;
  if(u[i+k]==u[i])
   memb1 = 0;
  else
   memb1 = ((t-u[i])/(u[i+k]-u[i]))*BasisFunction(k-1, i, u, t);
  if(u[i+k+1]==u[i+1])
   memb2 = 0;
  else
   memb2 = ((u[i+k+1]-t)/(u[i+k+1]-u[i+1]))*BasisFunction(k-1, i+1, u, t);
  return memb1+memb2;
 }
}

请帮忙。

函数BasisFunction()用于计算B样条基函数N(n,i)(t)的值,其中n为度数,i的范围为0到(m-1),m为控制点的数量。因此,要使用此函数,您需要为 B 样条定义以下内容:

  • 学位。
  • m个控制点,记为P[i][2],i=0~(m-1)
  • 结序列。这是 BasisFunction 的输入 "ParameterCollection"。您需要在结序列中有 (m+degree+1) 个结,并且结值需要单调不递减。具有 5 个控制点的 3 阶 B 样条的节点序列示例是 [0,0,0,0,u0,1,1,1,1],其中 u0 是 [0,1] 之间的任意值。

然后您可以通过以下方式评估参数 t 处 B 样条曲线上的任何点:

double point[2]={0.0}; // point on the B-spline curve
for (int ii=0; ii < m; ii++)  // loop thru all control points
{
    double basisVal = BasisFunction(degree, ii, knotSequence, t);

    point[0] += P[ii][0]*basisVal;
    point[1] += P[ii][1]*basisVal;
}