B样条算法

时间:2015-05-04 17:15:30

标签: c# bspline

我有绘制贝塞尔曲线的代码。是否可以修改此代码以绘制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-Spline曲线的代码。它看起来类似于我的代码,但我有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;
 }
}

请帮忙。

1 个答案:

答案 0 :(得分:2)

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

  • 度。
  • m个控制点,表示为P [i] [2],其中i = 0~(m-1)
  • 结序列。这是BasisFunction的输入“ParameterCollection”。你需要在结序列中有(m +度+ 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;
}