Большое спасибо за исправление первого сообщения.
Боюсь, однако, Вам придется все же разбираться в математике. Нехитрая она здесь, (полиномы третьего порядка, пара производных, и все на отрезке от 0 до 1 -- в общем, школьная), но все же придется. Иначе будет каша.
Я не уверен, что то, что Вы делаете можно назвать сплайном (я не специалист, гарантировать не буду). Основная проблема -- нету гладкости при соединении сегментов. По одному из определений (быть может, упрощенному) сплайн -- это кусочно-полиномиальная функция, непрерывная вместе с некоторым количеством производных на отрезке, и минимизирующая некоторый функционал (задающий такие свойства, как "округлость", прохождение через контрольные точки и т.п.). То, что делаете Вы не имеет непрерывной даже первую производную (я проверил обе матрицы).
1) рассмотрим что происходит на сегменте.
На самом деле, происходит весьма простая вещь. Полиномы порядка не выше третьего образуют четырехмерное пространство. Мы можем внем выбрать произвольный базис из четырех линейно-независимых полиномов, и тогда любой полином раскладывается по этому базису. В зависимости от базиса, мы получаем разные коэффициенты разложения. Выбор полиномов определяется доступностью параметров. Например, в случае Эрмита, мы имеем:
,
,
,
. То есть, сегмент, построеннй по Эрмиту, проходит через точки
и
, и его производные на концах отрезка задаются
и
. Для Catmull-Rom имеем:
,
,
,
. Обратите внимание -- Catmull-Rom проходит через
и
!
Фактически, выбрав систему параметров, мы автоматически выбираем систему полиномов -- она получается решением системы линейных уравнений невысокого порядка (для каждого из базовых полиномов
мы рассматриваем систему, когда отвечающий ему параметр
, а остальные
). Альтернативный подход -- выбрать базис (например, полиномы Бернштейна
и посмотреть, как лягут точки (кривая Безье; заметьте, как похоже на Catmull-Rom).
2) Построение сплайна.
К сожалению, построение сплайна -- штука более тонкая. Сплайн всегда "глобален" в том смысле, что слегка подвинув
мы изменяем поведение сплайна повсюду, в том числе на отрезке
. Он оптимизирует глобальный функционал, например, изогнутость. Поэтому приходится решать систему порядка
для
-точечного сплайна. Другого на дано -- Вы не можете строить сплайн посегментно. Взгляните еще раз на Catmull-Rom: если
и
расположены близко, а
и
далеко от них, то сегмент получает неоправданно высокие значения производных, что и приводит к неприятностям -- изгибам, петлям и т.п..
Сплайн же оптимизирует это поведение за счет выбора
и
. Они не вычисляются
явно из заданных точек. Напротив, их нахождение -- серьезная вычислительная работа.