2009-07-18 2 views
2

Я пытаюсь создать класс, который принимает любое количество точек (положение и управление) и создает сплайн catmull-rom на основе предоставленной информации.Подключение кабелей Catmull-Rom и их длина?

Что я делаю - и я действительно уверен, если это правильный способ сделать это - это хранение каждой отдельной точки в классе так:

class Point { public: Vector3 position; Vector3 control; }

Где очевидно, позиция положение точки и управления - контрольная точка.

Моя проблема заключается в подключении сплайнов - очевидно, учитывая, что вышеуказанный класс содержит точку в сплайновой решетке, указывает, что в любой заданной позиции может быть только одна контрольная точка. Поэтому, имея три или более точки в сплаве с кошачьим сплавом, различные индивидуальные сплайны с камуфляжем, которые соединены, разделяют одну позицию и один элемент управления с другим таким сплайном.

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

Очевидно, что вторая часть моего вопроса сама по себе поясняет: учитывая две точки управления и положения, как я могу рассчитать длину сплайна catmull-rom?

ответ

4

Для определения сплайна между двумя контрольными точками для сплайна Catmull-Rom необходимы контрольные точки и касательный вектор в каждой контрольной точке. Тем не менее, касательный вектор во внутренних (т.е. не конечная точка) контрольных точек определяется контрольных точек по обе стороны от него: Т (Р п) = (Р п + 1 - Р п-1)/2. Для замкнутых кривых сплайн полностью определяется набором контрольных точек. Для незамкнутых кривых вам необходимо также указать касательный вектор в первой и последней контрольной точке. Это обычно делается: Т (Р) = Р - Р и Т (Р п) = Р п - Р п-1.

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

Если вы хотите иметь кардинальный сплайн, то вы можете добавить весовой коэффициент к расчету касательных векторов, как в Wikipedia article.

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

1

Что касается измерения длины, вы можете сделать это с помощью исчисления с его полиномиальным сплайном. Вам нужно интегрировать функцию расстояния по линии. Его описание довольно хорошо описано на Wikipedia ...

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