Кривые и поверхности в компьютерной геометрии, I
Кубические сплайны
Пусть дана
точка
Требуется провести через эти точки кривую класса
т. е. имеющую непрерывные первые и вторые производные радиус-вектора по параметру:
и
- непрерывны по
Решение этой задачи можно дать в виде кубического сплайна. На каждом участке
такой сплайн описывается полиномом третьей степени по
При полиномиальной интерполяции степень полинома в данной задаче не может быть, вообще говоря, сделана меньше 3. Поэтому кубический сплайн имеет наименьшую степень в данной постановке задачи и определяется однозначно.
Пусть искомый сплайн задается параметрическим уравнением
Обозначим
Поскольку сплайн является кубическим, вторая производная радиус-вектора будет линейной функцией на каждом отрезке
:
![]() |
( 5.12) |
Проинтегрируем (5.12) два раза. Получим
![]() |
( 5.13) |
Постоянные
и
определим из условий, заданных на концах данного участка кривой:
![]() |
( 5.14) |
Подстановка (5.13) в (5.14) и вычисление
приводит к следующему ответу:
![]() |
( 5.15) |
Правая часть (5.15) является кубическим полиномом по
на отрезке
Она содержит два неизвестных векторных параметра
и
Их можно определить из условия согласованности первых производных на концах отрезков
Пока мы еще не использовали этого условия (вторые производные уже согласованы в силу определения si). На левом конце отрезка
мы имеем
![]() |
( 5.16) |
Аналогично, на правом конце отрезка
т.е. в той же точке
имеем
![]() |
( 5.17) |
Приравнивая правые части (5.16) и (5.17), получим
уравнение для внутренних точек
:
![]() |
( 5.18) |
Система (5.18) представляет собой систему из
векторного уравнения (или, что то же самое,
скалярного уравнения) с ленточной трехдиагональной матрицей и
векторных неизвестных
(что соответствует
скалярных неизвестных). Если кривая замкнута, то
и в систему (5.18) добавляется еще одно уравнение для
:

Таким образом, для замкнутой кривой число неизвестных равно числу уравнений и система имеет единственное решение.
Если кривая незамкнута, то необходимо задать граничные условия. Например, если рассматривать сплайны как гибкую нить, концы которой не имеют нагрузки на изгиб, получим такое условие:
![]() |
( 5.19) |
Еще один возможный вариант граничных условий:
![]() |
( 5.20) |
В последнем случае концевые участки кривой будут иметь постоянную кривизну.
Определив из системы (5.18) и граничных условий вида (5.19) или (5.20) (или каких-либо других, следующих из постановки задачи) значения
получим формулу для искомого кубического сплайна на участке
:

где
- местный параметр на участке ![[t_i,t_{i+1}].](/sites/default/files/tex_cache/4ab4c52beee0f478b4e61d9f695a78e4.png)
Замечание 5.2.1.
- В отличие от составного сплайна Эрмита, для кубического сплайна изменение положения одной из опорных точек всегда приводит к перевычислению всего сплайна.
-
Если взять равномерную параметризацию, т. е. положить
то уравнения (5.18) примут совсем простой вид:
Однако равномерная параметризация в случае неравномерного расположения опорных точек может привести к появлению необоснованных изгибов сплайна. Для того чтобы сплайн не имел подобных изгибов, параметризацию следует выбирать приблизительно натуральной. Для этого достаточно потребовать выполнения приблизительного равенства:

Сплайны в пакете Mathematica. Для создания сплайнов используется подпакет SplineFit, просто надо загрузить Splines' из Splines Package. Для этого используется функция SplineFit[data, type] , которая возвращает сплайн для данных data, используя сплайн-аппроксимацию типа type - по умолчанию это кубический сплайн Cube (другие типы - Bezier и CompositeBezier ).
Пример 5.2.5. Кубический сплайн с шестью управляемыми мышью опорными точками:
In[6] : = DynamicModule [ {pts , pts0, n = 6, spline},
Pts0= {{6.0, -5.0}, {0.0, 0.0}, {4.8, 5.2}, {20.3, 10.5}, {6.8, 12.2},
{20.0, 20.0}};
Manipulate[Show[{
ParametrioPlot[spline[pts][x], {x, 0, 6},
PlotStyle -> {Thick}] , Graphics [ {Red,
Text[ToString[#- 1] ,
pts[[#]] + {1.4, 0}] & /@ Range [n] }} } ,
PlotRange ->{{-l,23}, {-6, 21}}],
{{pts, ptsO}, Locator}],
Initialization : -> (
Needs["Splines'"];
spline[pfcs_] := SplineFit[pts, Cubic])]









