Отрывистые ошибки при попытке вычислить B-сплайн - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь реализовать алгоритм B-сплайна в python для его изучения, однако я делаю что-то не так.

Для B-сплайна степени 1 (порядок 2) я могу рисовать без проблем, в результате чего:

enter image description here

Но для степени 2 (порядок 3) B-сплайн я генерирую много странных отрывочных артефактов:

enter image description here

Я пытаюсь добиться этого в 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]

Это попытка реализации этого псевдокода: enter image description here

Я пытался выяснить, находится ли проблема в последовательности узлов, порядке точек или что-то в этом роде, но я добавляю дополнительные узлы, равные степени наначало и конец последовательности узлов, например, [0,1,2] в степени 2 становится [0,0,0,1,2,2,2].Я также проверил правильность количества точек.

Однако я не могу найти причину резких ошибок.Похоже, что я неправильно вычисляю индекс интервала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...