Интерполяция кубическими сплайнами

Форум для обсуждения вопросов математики

Модератор: Admin

PLUG
Сообщения: 2
Зарегистрирован: Чт апр 27, 2006 9:56 am
Контактная информация:

Интерполяция кубическими сплайнами

Сообщение PLUG » Чт апр 27, 2006 11:16 am

Добрый день!

Передо мной стоит задача построения кубического сплайна по заданным (четырем) точкам (сплайны Безье, Т- и Б-сплайны и NURBS не подходят ввиду того, что сплайн должен проходить через контрольные точки). Выбор остановился на Cardinal, Catmull-Rom, Kochanek-Bartels сплайнах. Все они дают примерно одинаковые результаты. Если пропустить все выкладки, получим следующее: Есть 4 контрольные точки Р1, Р2, Р3, Р4 и нужно интерполировать сплайн между Р2 и Р3

| s^3 |
S = | s^2 |
| s^1 | где s- положение искомой точки (0...1)
| 1 |

| P2 |
C = | P3 |
| T2 | - вектор параметров кривой
| T3 |
Т2 = 0.5*(Р3-Р1), Т3 = 0.5*(Р4-Р2)
Вектор С может состоять и из |Р1,Р2,Р3,Р4| в зависимости от типа сплайна

и наконец матрица полиномов, например для hermite
сплайнов она имеет вид

| 2 -2 1 1 |
h = | -3 3 -2 -1 |
| 0 0 1 0 |
| 1 0 0 0 |

Тогда искомые точки сплайна находятся как:

P = S * h * C.

Для Catmull-Rom сплайнов имеет место такая формула:
q(t) = 0.5*[ t^3 t^2 t 1 ]*[ -1 3 -3 1 ] * [ p1 ]
[ 2 -5 4 -1 ] [ p2 ]
[ -1 0 1 0 ] [ p3 ]
[ 0 2 0 0 ] [ p4 ]

и опять же матрица полиномов.

Теперь собственно сам вопрос. Как находится эта матрица полиномом?

И так как из вопроса видно, что я далек от математики, может уважаемые подскажут, как изменить/найти значения полиномов, чтобы сплайн приобрел более округлую форму?

как есть:
Изображение

как хотелось бы:
Изображение

PLUG
Сообщения: 2
Зарегистрирован: Чт апр 27, 2006 9:56 am
Контактная информация:

Сообщение PLUG » Пт апр 28, 2006 10:55 am

Прошу прощения за невнятный вопрос. Это потому, что у меня нет математической базы в
данной теме.

Постараюсь по-другому спросить. Есть опять же 4ре точки Р1, Р2, Р3,Р4. Для
того, чтобы построить по ним сплайн необходимо:

Р(t)= Р1*Н1(t) + Р2*Н1(t) + Р3*Н3(t) + Р4*Н4(t), где Н1(t), Н2(t), Н3(t),
Н4(t) некоторые функции (полином?), которые я понаходил в интернете.

Для каждого типа сплайнов (Вezier, Cardinal, Catmull-Rom и пр) эти функции
свои.

Например я использую (по моему Catmull-Rom) :

Н1(t) = 0.5*(-t^3 + 2.0*t^2 - t);

Н2(t) = 0.5*(3.0*t^3 - 5.0*t^2 + 2.0);

Н3(t) = 0.5*(-3.0*t^3 + 4.0*t^2 + t);

Н4(t) = 0.5*(t^3 - t^2).

Сейчас опять могу начать бред нести, но как я понимаю, коэффициенты для t^3,
t^2, t, 1 находятся из полинома. Они же и влияют на то, как будет проходить
сплайн через контрольные точки (ближе к прямой, соединяющей контр. точки,
или дальше от нее - более округло 8-) ). Эти коэффициенты я и записал в
матричной форме в предыдущем сообщении. Если это так, тогда хотелось бы
узнать, как эти коэффициенты находятся или как их можно изменить, для
изменения формы сплайна

Alex.Pi
Сообщения: 2
Зарегистрирован: Ср июн 20, 2012 1:09 pm

Сообщение Alex.Pi » Ср июн 20, 2012 1:16 pm

Эта матрица взялась отсюда http://alvyray.com/Memos/CG/Pixar/spline77.pdf

Ее так же можно получить самому из алгоритма по построению сплайнов.

Alex.Pi
Сообщения: 2
Зарегистрирован: Ср июн 20, 2012 1:09 pm

Re: Интерполяция кубическими сплайнами

Сообщение Alex.Pi » Ср июн 20, 2012 1:45 pm

PLUG писал(а):Для Catmull-Rom сплайнов имеет место такая формула:
q(t) = 0.5*[ t^3 t^2 t 1 ]*[ -1 3 -3 1 ] * [ p1 ]
[ 2 -5 4 -1 ] [ p2 ]
[ -1 0 1 0 ] [ p3 ]
[ 0 2 0 0 ] [ p4 ]

и опять же матрица полиномов.

Теперь собственно сам вопрос. Как находится эта матрица полиномом?


В ур-нии для q(t) стоит коеффициент 0.5. Этот коефф. называется натяжением. Изменяя его, можно менять "натяжение" сплайна. Таким образом, он моэет быть более округлым. Для Кардинал-сплайнов вместо 0.5 пишут (1 - t), где t и есть натяжение (может быть отрицательным).