B-spline algorithm



我有用于绘制bezier曲线的代码。修改此代码以绘制B-Spline曲线是否可以选择?

这是我使用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;
 }
}

请帮助。

函数basIffunction()用于计算b-spline基函数n(n,i)(t)的值,其中n为gen,我从0到(m-)1)M是控制点的数量。因此,要使用此功能,您需要为B-Spline定义以下内容:

  • 学位。
  • m控制点,将它们表示为p [i] [2],i = 0〜(m-1)
  • 结序。这是对基符的输入"参数"。您需要在结序列中具有(M 度 1)结,并且结值在单调上不受约束。具有5个控制点的3度B型结节的结序示例是[0,0,0,0,U0,1,1,1,1],其中U0是[0,1]之间的任何值。

然后,您可以通过以下内容来评估参数t的B-Spline曲线上的任何点:

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

相关内容

  • 没有找到相关文章

最新更新