You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 18:33:34