Нахождение вершины кривой Безье

Я работаю на flex, хотя я считаю, что это независимая от языка проблема. Я пытаюсь нарисовать кривую, используя 3 точки, используя curveTo (квадратичная функция Безье, я не верю, что у Flex есть какая-либо другая, если это так, поправьте меня!) Точки 1 и 3 являются «узлами», с точкой 2 - ручка перетаскивания.

Я хочу, чтобы линия не изгибалась в направлении точки 2, а фактически проходила через нее. Мне удалось заставить это работать, по счастливой случайности - удвоив (расстояние между средней точкой линии между точками 1 и 3) и точкой 2.

Однако это не ставит его на вершину линии, просто где-то близко к ней.

У кого-нибудь есть идеи?

Андрей


person Andrew    schedule 05.07.2010    source источник
comment
Сплайны Безье по определению не проходят через свои контрольные точки (за исключением, я думаю, вырожденных случаев). Существуют кубические сплайны, которые делают по своей конструкции включают контрольные точки (Catmull-Rom), но я ничего не знаю о Flex, поэтому не могу сказать, поддерживаются ли они каким-либо образом. Их совсем не сложно реализовать; Я действительно тупой, и мне удавалось кодировать это несколько раз в прошлом.   -  person Pointy    schedule 05.07.2010
comment
Похоже, вы действительно хотите выбрать место для маркера перетаскивания, чтобы кривая проходила через выбранную вами точку. Да? Являются ли ваши точки произвольными или каким-то образом ограниченными, т.е. точка 2 фактически находится на биссектрисе линии от 1 до 3?   -  person phkahler    schedule 12.08.2011


Ответы (3)


квадратичная кривая Безье рассчитывается по формуле

B(t) = (1-t)(1-t)*P0 + 2(1-t)t*P1 + t*t*P2

где P0, P1 и P2 — это 3 указанные вами точки. Кривая начинается в P0 и заканчивается в P2. t варьируется от 0 до 1, вершина должна быть достигнута при t = 0,5, поэтому попробуйте вставить P0, P2 и t = 0,5 в формулу, установив ее равной точке, в которой вы хотите, чтобы вершина быть и извлечь P1 из формулы

person Nikolaus Gradwohl    schedule 05.07.2010
comment
Спасибо за это, я уже посмотрел на формулу. Проблема заключается в том, что вершина не всегда находится при t = 0,5. - person Andrew; 07.07.2010

Используйте эту формулу: B'(t) = 3 (1 - t) 2 (P1 - P0) + 6 (1 - t) t (P2 - P1) + 3 t2 (P3 - P2)

Вы можете использовать производную, чтобы найти максимумы и минимумы.

person Bobby    schedule 28.10.2017

Сплайн Безье не будет проходить через контрольные точки, а сплайн Катмулла-Рома пройдет.

B(t) = ((2*P1)+(-P0+P2)*t + (2*P0-5*P1+4*P2-P3)*t*t + (-P0+3*P1-3*P2+P3)*t*t*t )) / 2

Хотя это кубический, а не квадратичный сплайн. Вы можете попробовать сделать P1=P2

person Mike B    schedule 12.08.2011