B样条Cox-de Boor算法实现出现(0,0)异常点bug如何修复?
Cox-de Boor算法实现B样条曲线终点异常问题
问题现象
- 自主实现Cox-de Boor算法生成B样条曲线时,(0,0)坐标位置始终存在异常点,曲线显示效果异常。
参考正确实现(基于scipy)
以下代码可正常生成符合预期的B样条曲线:
import numpy as np from scipy import interpolate import matplotlib.pyplot as plt import torch # 定义控制点 Cp = torch.tensor([(3 , 1), (2.5, 4), (0, 1), (-2.5, 4),(-3, 0), (-2.5, -4), (0, -1), (2.5, -4), (3, -1)]) x = Cp[:,0] y = Cp[:,1] l = len(x) # 构造节点矢量 t = np.linspace(0,1,l-2,endpoint=True) t = np.append([0,0,0],t) t = np.append(t,[1,1,1]) tck = [t,[x,y],3] # 采样计算曲线上的点 u3 = np.linspace(0,1,(max(l*2,70)),endpoint=True) out = interpolate.splev(u3,tck) # 绘图 plt.figure() plt.plot(x,y,'k--',label='Control polygon',marker='o',markerfacecolor='red') plt.plot(out[0],out[1],'b',linewidth=2.0,label='B-spline curve') plt.show()
该代码运行后输出的曲线终点为最后一个控制点
(3,-1),无异常点。
自主实现代码
核心Cox-de Boor递归基函数
def N_i_p_vec(u,U,i,p): def deg_0(u,ui,ui_1): u2 = torch.where((ui<=u) & (u<ui_1),1,0) return u2 if p>0: exp1 = torch.nan_to_num((u-U[i])/(U[i+p]-U[i])*N_i_p_vec(u,U,i,p-1),0) exp2 = torch.nan_to_num(((U[i+p+1]-u)/(U[i+p+1]-U[i+1]))*N_i_p_vec(u,U,i+1,p-1),0) return exp1+exp2 if p==0: return deg_0(u,U[i],U[i+1])
曲线点计算循环
p = 3 m = len(t)-1 num_basis = m-p-1 o2 = torch.zeros(2,len(u3)) for i in range(num_basis): N_m = N_i_p_vec(torch.tensor(u3),t,i,p) P_ij = Cp[i,:] c_tmp = torch.einsum('i,j->ji',N_m,P_ij) o2 += c_tmp
绘图代码
plt.figure() plt.plot(*o2,'b',linewidth=2.0,label='B-spline curve') plt.plot(x,y,'k--',label='Control polygon',marker='o',markerfacecolor='red')
该代码运行后生成的曲线存在(0,0)位置的异常点,显示效果不符合预期。
排查进展
- 对比自主实现输出的数组
o2与scipy输出的正确数组out发现:自主实现的输出数组最后一个元素为(0,0),与scipy输出的正确终点值(3,-1)不符,异常点对应曲线终点位置。
内容的提问来源于stack exchange,提问作者Maelstorm
相关产品推荐
相关产品推荐

