Кривые и поверхности в компьютерной геометрии, 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) (или каких-либо других, следующих из постановки задачи) значения получим формулу для искомого кубического сплайна на участке :
где - местный параметр на участке
Замечание 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])]