我有绘制贝塞尔曲线的代码。是否可以修改此代码以绘制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;
}
}
请帮忙。
答案 0 :(得分:2)
函数BasisFunction()用于计算B样条基函数N(n,i)(t)的值,其中n是度,i的范围是0到(m-1),m是数字控制点。因此,要使用此功能,您需要为B样条定义以下内容:
然后,您可以通过以下方式评估参数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;
}