B样条算法
B-spline algorithm
我有绘制贝塞尔曲线的代码。是否可以修改此代码以绘制 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],其中 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;
}
我有绘制贝塞尔曲线的代码。是否可以修改此代码以绘制 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],其中 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;
}