Соединить сплайны Catmull-Rom и рассчитать их длину? - PullRequest
2 голосов
/ 18 июля 2009

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

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

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

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

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

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

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

Ответы [ 2 ]

4 голосов
/ 18 июля 2009

Чтобы определить сплайн между двумя контрольными точками, сплайну Катмулла-Рома нужны контрольные точки и касательный вектор в каждой контрольной точке. Однако касательный вектор во внутренних (то есть не конечных) контрольных точках определяется контрольными точками по обе стороны от него: 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 .

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

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

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

1 голос
/ 18 июля 2009

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

...