Катушки-Rom сплайны - как они работают?

На этом сайте, который, как представляется, имеет самую подробную информацию о сплайнах catmull-rom: http://www.mvps.org/directx/articles/catmull/, он упоминает о необходимости четырех пунктов: создать сплайн. Однако он не упоминает, как точки p0 и p3 влияют на значения между p1 и p2.

Еще один вопрос: как бы вы создали непрерывные сплайны? Было бы так же легко, как определить, что точки p1, p2 должны быть непрерывными с p4, p5, сделав p4 = p2 (то есть предположим, что p0, p1, p2, p3, p4, p5, p6... pN).

Более общий вопрос заключается в том, как можно вычислить тангенсы на сплайнах ротации катмула? Должно ли это включать в себя взятие двух точек на сплайне (скажем, 0,01, 0,011) и получение касательной на основе пифагоров с учетом координат положения, которые вводят эти значения?

Ответы

Ответ 1

Взгляните на уравнение 2 - он описывает, как контрольные точки влияют на линию. Вы можете увидеть точки P0 и P3 перейти в уравнение для построения точек вдоль кривой от P1 до P2. Вы также увидите, что уравнение дает P1, когда t == 0 и P2, когда t == 1.

Это примерное уравнение может быть обобщено. Если у вас есть точки R0, R1,... RN, тогда вы можете построить точки между RK и RK + 1, используя уравнение 2 с P0 = RK - 1, P1 = RK, P2 = RK + 1 и P3 = RK + 2.

Вы не можете отстроить от R0 до R1 или от RN - 1 до RN, если вы не добавите дополнительные контрольные точки для входа R - 1 и RN + 1. Общая идея заключается в том, что вы можете выбрать любые точки, которые хотите добавить в голову и хвост последовательности, чтобы дать себе все параметры для вычисления сплайна.

Вы можете объединить два сплайна, сбросив одну из контрольных точек между ними. Скажем, вы имеете R0, R1,..., RN и S0, S1,... SM их можно объединить в R0, R1,..., RN - 1, S1, S2,... SM.

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

Ответ 2

Статья в Википедии идет немного глубже. Общий вид сплайна принимает в качестве входных 2 контрольных точек с соответствующими касательными векторами. Затем могут быть добавлены дополнительные сегменты сплайнов при условии, что касательные векторы в общих контрольных точках равны, что сохраняет непрерывность C1.

В конкретной форме Катмулла-Рома касательный вектор в промежуточных точках определяется местоположениями соседних контрольных точек. Таким образом, для создания непрерывного сплайна C1 через несколько точек достаточно обеспечить набор контрольных точек и касательных векторов в первой и последней контрольной точке. Я считаю, что стандартное поведение заключается в использовании P1-P0 для касательного вектора в P0 и PN-PN-1 при PN.

Согласно статье Википедии, для вычисления тангенса в контрольной точке Pn вы используете это уравнение:

T(n) = (P(n - 1) + P(n + 1)) / 2

Это также отвечает на ваш первый вопрос. Для набора из 4 контрольных точек P1, P2, P3, P4, интерполирующие значения между P2 и P3 требуют, чтобы информация составляла все 4 контрольные точки. P2 и P3 сами определяют конечные точки, через которые должен проходить интерполяционный сегмент. P1 и P3 определяют касательный вектор, который интерполирующий сегмент будет иметь в точке P2. P4 и P2 определяют касательный вектор, который сегмент будет иметь в точке P3. Касательные векторы в контрольных точках P2 и P3 влияют на форму интерполирующего сегмента между ними.