В математическом подполе численного анализа алгоритм De Boor
является полиномиальным временем и численным стабильным алгоритмом для
, оценивающего кривые сплайн в форме b-spline. Это обобщение алгоритма
de Casteljau для кривых Bézier. Алгоритм был разработан
немецко-американским математиком Карлом Р. де Буром. Упрощенный,
потенциально более быстрые варианты алгоритма De Boor были созданы
, но они страдают от сравнительно более низкой стабильности.
Код: Выделить всё
def deBoor(k: int, x: int, t, c, p: int):
"""Evaluates S(x).
Arguments
---------
k: Index of knot interval that contains x.
x: Position.
t: Array of knot positions, needs to be padded as described above.
c: Array of control points.
p: Degree of B-spline.
"""
d = [c[j + k - p] for j in range(0, p + 1)]
for r in range(1, p + 1):
for j in range(p, r - 1, -1):
alpha = (x - t[j + k - p]) / (t[j + 1 + k - r] - t[j + k - p])
d[j] = (1.0 - alpha) * d[j - 1] + alpha * d[j]
return d[p]
Код: Выделить всё
d = [c[j + k - p] for j in range(0, p + 1)]
Код: Выделить всё
j = 0;
k = 0;
p = 3;
Вопрос: Как предотвратить попытки доступа к негативным индексам C ? Результаты выглядят нормально, но может ли это быть правильно?
Код: Выделить всё
alpha = (x - t[j + k - p]) / (t[j + 1 + k - r] - t[j + k - p])
Подробнее здесь: https://stackoverflow.com/questions/793 ... a-b-spline