Я пытаюсь реализовать алгоритм B-сплайна в python для его изучения, однако я делаю что-то не так.
Для B-сплайна степени 1 (порядок 2) я могу рисовать без проблем, в результате чего:
Но для степени 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]
Это попытка реализации этого псевдокода:
Я пытался выяснить, находится ли проблема в последовательности узлов, порядке точек или что-то в этом роде, но я добавляю дополнительные узлы, равные степени наначало и конец последовательности узлов, например, [0,1,2] в степени 2 становится [0,0,0,1,2,2,2].Я также проверил правильность количества точек.
Однако я не могу найти причину резких ошибок.Похоже, что я неправильно вычисляю индекс интервала.