2009-07-02 4 views
2

Я хотел бы получить код в AS2 для интерполяции квадратичной кривой Безье. узлы должны находиться на постоянном расстоянии друг от друга. В принципе, он должен анимировать шар с постоянной скоростью по негиперболической квадратичной кривой Безье, определяемой 3 очками. Спасибо!Квадратичная интерполяция Безье

+0

Я уже видел некоторые сложные математические материалы, но он включает в себя интегралы, которые я не знаю, как делать в as2 – 2009-07-02 13:43:59

ответ

5

Кривая кривой Безье действительно довольно проста, поэтому я вам поможем, и вы можете перевести ее в 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 как количество шагов вдоль кривой, которые вы хотели бы видеть.

1

Обратите внимание, что выражение может быть сделано гораздо эффективнее математически.

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 = Вы сохранили одно умножение = двойное исполнение.

+4

Хотя может быть правдой, что вы можете сэкономить несколько размножений, базис Бернштейна по своей сути более численно устойчив. Поэтому, если точность является проблемой, полином должен * не * быть реорганизован. По общему признанию, это не имеет большого значения для анимации мяча, но это огромная сделка в пакетах САПР. – Naaff

1

Решение, предложенное 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.