我有用于绘制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;
}