我正在尝试在python中实现B样条算法以进行研究,但是我做错了。
对于1级(2级)B样条曲线,我可以毫无问题地进行绘制,结果:
但是对于2度(3阶)B样条曲线,我会生成很多奇怪的抖动产物:
我试图在python中实现它的方法是:
def p_curve(knots, points, t):
#Initialize
assert(len(knots)==len(points))
point_num = len(points)
degree = 2
if len(points) <= degree:
return points[0]
index = 0
# Extend knot sequence
k = knots.copy()
for i in range (0, degree):
k += [k[len(k)-1]]
k = [k[0]] + k
# Find containing interval
while not(t>= k[index] and t < k[index+1]):
index += 1
if index >= len(points):
index = -1
old_list = []
for i in range(0, degree + 1):
old_list += [points[index-i]]
for r in range(degree+1, 1, -1):
i=index
for s in range(0, degree):
omega = (t - k[i]) / (k[i+degree] - k[i])
old_list[s] = omega * old_list[s] + (1-omega)*old_list[s+1]
return old_list[0]
我试图查看问题是否出在结序列,点的顺序或类似的问题上,但是,我在结序列的开始和结束处附加了与度数相等的额外结,例如[度2的0,1,2]变为[0,0,0,1,2,2,2]。我还验证了分数的正确性。
但是,我找不到生涩的错误的根源。看来我计算的间隔索引错误。