Я хотел бы получить код в AS2 для интерполяции квадратичной кривой Безье. узлы должны находиться на постоянном расстоянии друг от друга. В принципе, он должен анимировать шар с постоянной скоростью по негиперболической квадратичной кривой Безье, определяемой 3 очками. Спасибо!Квадратичная интерполяция Безье
ответ
Кривая кривой Безье действительно довольно проста, поэтому я вам поможем, и вы можете перевести ее в ActionScript.
2D квадратичная кривая Безье определяется тремя координатами (x,y)
. Я буду называть их P0 = (x0,y0)
, P1 = (x1,y1)
и P2 = (x2,y2)
. Дополнительно значение параметра t
, которое колеблется от 0
до 1
, используется для указания любой позиции вдоль кривой. Все переменные x
, y
и t
являются вещественными (с плавающей запятой).
Уравнение для квадратичной кривой Безье является:
P(t) = P0*(1-t)^2 + P1*2*(1-t)*t + P2*t^2
Таким образом, используя псевдокод, мы можем плавно проследить кривую Безье следующим образом:
for i = 0 to step_count
t = i/step_count
u = 1 - t
P = P0*u*u + P1*2*u*t + P2*t*t
draw_ball_at_position(P)
Это предполагает, что вы уже определили пункты P0
, P1
и P2
как указано выше. Если вы равномерно распределяете контрольные точки, вы должны получить хорошие ровные шаги вдоль кривой. Просто определите step_count как количество шагов вдоль кривой, которые вы хотели бы видеть.
Обратите внимание, что выражение может быть сделано гораздо эффективнее математически.
P(t) = P0*(1-t)^2 + P1*2*(1-t)*t + P2*t^2
и
P = P0*u*u + P1*2*u*t + P2*t*t
обоих трюмов т умножений, которые могут быть упрощены.
Например:
C = A*t + B(1-t) = A*t + B - B*t = t*(A-B) + B
= Вы сохранили одно умножение = двойное исполнение.
Хотя может быть правдой, что вы можете сэкономить несколько размножений, базис Бернштейна по своей сути более численно устойчив. Поэтому, если точность является проблемой, полином должен * не * быть реорганизован. По общему признанию, это не имеет большого значения для анимации мяча, но это огромная сделка в пакетах САПР. – Naaff
Решение, предложенное Naaff, то есть P(t) = P0*(1-t)^2 + P1*2*(1-t)*t + P2*t^2
, поможет вам правильно «форму», но выбор равномерно разнесены t
в интервале [0:1]
не будет производить равномерно разнесены P(t)
. Другими словами, скорость не постоянна (вы можете отличить предыдущее уравнение от t
, чтобы увидеть его).
Обычно обычным методом прохождения параметрической кривой с постоянной скоростью является повторная калибровка по длине дуги. Это означает выражение P
как P(s)
, где s
- длина, пройденная вдоль кривой. Очевидно, s
изменяется от нуля до общей длины кривой. В случае квадратичной кривой Безье существует решение с замкнутой формой для длины дуги как функция от t
, но это немного сложно. Вычислительно, часто быстрее просто интегрировать численно, используя ваш любимый метод. Обратите внимание, однако, что идея состоит в том, чтобы вычислить обратное отношение, то есть t(s)
, чтобы выразить P
как P(t(s))
. Затем, выбирая равномерно распределенные s
, вы получите равномерное пространство P
.
Я уже видел некоторые сложные математические материалы, но он включает в себя интегралы, которые я не знаю, как делать в as2 – 2009-07-02 13:43:59