Соединить вместе шлицы Катмулла-Рома и рассчитать их длину?

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

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

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

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

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

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

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


person meds    schedule 18.07.2009    source источник


Ответы (2)


Чтобы определить сплайн между двумя контрольными точками, сплайну Катмулла-Рома нужны контрольные точки и касательный вектор в каждой контрольной точке. Однако касательный вектор во внутренних (т.е. не конечных) контрольных точках определяется контрольными точками по обе стороны от него: T (P n) = (P n + 1 - P n-1) / 2. Для замкнутых кривых сплайн полностью определяется набором контрольных точек. Для незамкнутых кривых необходимо также указать касательный вектор в первой и последней контрольной точке. Обычно это делается: T (P 0) = P 1 - P 0 и T (P n) = P n - P n-1.

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

Если вы хотите иметь кардинальный сплайн, вы можете добавить весовой коэффициент к вычислению касательного вектора, как в Статья в Википедии.

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

person Eric    schedule 18.07.2009

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

person jheriko    schedule 18.07.2009