Hartley-Judd计算非均匀B样条节点矢量
在前面的文章介绍了用里森菲尔德法分别计算奇次和偶次B样条节点矢量,但是这种方法与实际情况存在出入,Hartley-Judd计算法与曲线的次数无关,可以采用统一的计算公式。
理论公式、代码参考《计算几何算法与实现》–孔令德
其代码实现为:
/*----------------------------------------------------
input :
function:哈特利-贾德法计算非均匀节点
-----------------------------------------------------*/
void HJ_calculate_knot(void)
{
//两端点取K+1个重复度
for(int i=0; i<=k; i++)
knot[i]=0.0;
for(int i=n+1; i<=n+k+1; i++)
knot[i]=1.0;
//计算n-k个内节点
for(int i=k+1; i<=n; i++)
{
double sum=0.0;
for(int j=k+1; j<=i; j++)
{
//计算分子项
double numerator=0.0;
for(int loop=j-k; loop<=j-1; loop++)
{
numerator+=sqrt((P[loop].x-P[loop-1].x)*(P[loop].x-P[loop-1].x)
+(P[loop].y-P[loop-1].y)*(P[loop].y-P[loop-1].y));
}
//计算分母项
double denominator=0.0;
for(int loop1=k+1; loop1<=n+1; loop1++)
{
for(int loop2=loop1-k; loop2<=loop1-1; loop2++)
{
denominator+=sqrt((P[loop2].x-P[loop2-1].x)*(P[loop2].x-P[loop2-1].x)
+(P[loop2].y-P[loop2-1].y)*(P[loop2].y-P[loop2-1].y));
}
}
sum+=numerator/denominator;
}
knot[i]=sum;
}
}