Получаете точку сплайна кошки через определенное расстояние? - PullRequest
4 голосов
/ 04 октября 2009

Если у меня есть Сплайн Catmull-Rom определенной длины, как я могу рассчитать его положение на определенном расстоянии? Как правило, чтобы вычислить точку в сплайне кошачьего рома, вы вводите значение от 0 до 1, чтобы получить его положение в пропорциях, как я могу сделать это для расстояний? Например, если мой сплайн имеет длину 30 единиц, как я могу получить его положение на расстоянии 8?

Причина, по которой я спрашиваю, заключается в том, что, по-видимому, сплайны с катом на романе, дающие точки в области [0,1], не гарантируют, что они дадут вам точку на этом расстоянии в сплайне, например, если я введу 0,5 в ромб сплайн длиной 30 не означает, что я получу положение на расстоянии 15 от сплайна, если сам сплайн фактически не является прямой линией.

Ответы [ 3 ]

3 голосов
/ 07 октября 2009

Другая ссылка: Адаптивное подразделение кривых Безье в библиотеке антизерновой геометрии
в основном о другой проблеме рисования кривых Безье на сетке пикселей с широкой кистью, но вижу самый конец.
(Добавлено :) Antigrain также имеет прекрасные примеры / bspline.cpp в котором вы можете перемещать узлы и варьировать количество промежуточных точек.

3 голосов
/ 04 октября 2009

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

Findinf ответ не итеративно НЕВЕРОЯТНО дорогой (я видел вывод некоторое время назад, и это было не красиво;)). Вам понадобится небольшое значение эпсилона, чтобы ухудшить производительность ...

1 голос
/ 07 октября 2009

Гоз ответ точен - вот обсуждение о длине кривых Безье . Краткое изложение постеров состояло в том, что вычисление (и намного проще) выполнить приближение, чем вычисление точного ответа. Это применимо, потому что вы можете изменить основу параметрических сплайнов, чтобы вы могли преобразовать кривую Катмулла-Рома в сегменты Безье.

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

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

...