2013-12-02 5 views
1

Мне предлагается создать рекурсивную функцию, называемую Безье, которые являются списком заданных точек и точкой, которую необходимо оценить t. Он возвращает точку кривой Безье, определяемую контрольными точками списка точек.Рекурсивная функция кривой Безье python

Это алгоритм, который я сделал:

def Bezier(point_list, t): 
    if len(point_list)==1: 
     return point_list[0] 
    else: 
     P1=Bezier(point_list[0:-1],t) 
     P2=Bezier(point_list[1:],t) 
     P=(1-t)*P1 + t*P2 
     return P 

и это список точек Дано:

point_list=[ (0,0), (10,-1), (13,5), (-7,8), (2,2) ] 

Как я могу знать, если моя функция является правильным?

+1

Как насчет, график результатов и посмотреть, хорошо ли они выглядят? – Kevin

+1

Я не понимаю, почему вы делаете рекурсивные призывы к Безье; похоже, что степень кривой зависит от количества пройденных точек? Это очень странно. –

+0

Это типично для кривых Безье, @HughBothwell. Кривая порядка N имеет ровно N + 1 контрольных точек. – Kevin

ответ

2

Он выглядит правильно; вы можете попробовать его на нескольких наборах точек и посмотреть, соответствует ли поведение тому, что вы ожидаете (т. е. для контрольных точек вдоль x = 0, y = 0 или x = y, все результирующие точки должны лежать вдоль одной и той же строки).

Вы также можете воспользоваться зеркалированием; т.е. для всех t, Bezier([a, b, c], t) == Bezier([c, b, a], 1.-t). Если ваши результаты не показывают этого поведения, ваша функция не может быть правильной.

Если я пытаюсь запустить код, я получаю TypeError для попытки умножить кортеж на float; вам может понадобиться развернуть этот код, т. е.

def Bezier(point_list, t): 
    if len(point_list)==1: 
     return point_list[0] 
    else: 
     P1=Bezier(point_list[0:-1], t) 
     P2=Bezier(point_list[1:], t) 
     nt = 1. - t 
     return (nt * P1[0] + t * P2[0], nt * P1[1] + t * P2[1]) 
+0

Спасибо @Hughbothwell Kevin, он отлично работает !! – user3058463

Смежные вопросы