我有用于绘制贝塞尔曲线的代码。可以修改此代码以绘制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,1],其中u0是[0,1]之间的任何值。


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

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;
}

09-30 00:15