Кривые и поверхности в компьютерной геометрии, II
B-кривые (бета-кривые)
Основными недостатками кривых Безье являются следующие:
- смещение любой опорной точки глобально влияет на всю кривую;
- сложно обеспечить точное прохождение кривой через заданные точки (кроме крайних опорных точек, являющихся концами кривой).
Поэтому при работе с кривыми Безье часто приходиться прибегать к делению кривой Безье, т. е. по сути дела - к замене одной кривой другими. Поэтому естественным образом возникает задача построения такого класса кривых, который бы позволял избежать недостатков 1), 2) и решать соответствующие задачи управления кривой путем изменения управляющих параметров кривой, а не путем ее замены на другие кривые.
Вспомним, что рациональная кривая Безье, построенная по точкам с весами
определялась формулой
![]() |
( 6.1) |
где - базис Бернштейна на [0,1].
Из формулы (6.1) видно, что глобальное влияние каждой опорной точки на всю кривую происходит из-за того, что каждая из функций
не равна нулю на всем интервале (0,1). Если бы вместо функций Бернштейна в формуле (6.1) выступали функции с локальными носителями, существенно меньшими, чем область определения параметра кривой
то удалось бы как локализовать влияние отдельной точки на всю кривую, так и добиться (за счет выбора таких функций) прохождения кривой через некоторую заданную точку.
Поэтому поставим задачу следующим образом. Пусть даны опорные точки с весами
Определим кривую
по формуле
![]() |
( 6.2) |
где - набор кусочно-полиномиальных функций таких, что
-
при
;
-
для любой гладкой функции
существует линейная комбинация
интерполирующая функцию
в заданных узлах
-
для каждого
Последнее условие вводится для того, чтобы в случае совпадения всех опорных точек кривая превращалась бы в ту же точку.
Решение поставленной задачи основывается на понятии разделенных разностей и называется В-кривой. В-кривые обобщают кривые Безье.
Разделенные разности
Пусть имеется гладкая на каждом отрезке функция
и фиксированы некоторые значения
переменной
(не обязательно различные и не обязательно упорядоченные по возрастанию или убыванию
). Мы также будем рассматривать переменное значение
которое будем считать первым в последовательности. Поскольку оно предшествует значению
припишем ему индекс 0 (хотя в большинстве случаев будем обозначать его просто
без индекса):
Обозначим
Определим оператор правого сдвига
:
![Et_i = t_{i+1},\\
Ef_i = f_{i+1}\\
(0 \le i \le m).](/sites/default/files/tex_cache/732e7321be47837ad21b45dbc8fa3a53.png)
Определение 6.1.1. Разделенной разностью функции в узле
порядка
называется величина
![]() |
( 6.3) |
Разделенная разность является дискретным аналогом операции дифференцирования соответствующего порядка.
При этом если то в правой части (6.3) появляется отношение вида
которое по определению полагается равным
![R^{(k)}f_i=lim_{\delta_1, \dots, \delta_k \to 0, \delta_i > 0} R_{\delta_1, \dots, \delta_k}^{(k)}f_i](/sites/default/files/tex_cache/7de11f8a3536c367b32e1c6826477b3f.png)
где определяется по возмущенным узлам
где
Теорема 6.1. Если то
Пример 6.1.1. Разделенная разность пятого порядка функции как функция первого узла (программа не вычисляет производные при совпадении узлов):
In[1]:= DynamicModule [{n = 5, tt, F, h, L, t, t2, t3, t4, t5, f, p, S, z}, f [t_] := Cos [t] ; Manipulate[ tt = Join[{t} , ss] ; p[i_, s_] := Apply [ Times , (s - tt [ [#] ] ) &/@ Drop [Range [n] , {i}]]; S = Flatten [Table [Table [ss[ [j] ] - ss [ [i] ] , {i, 1, j - 1}] , {j, 2, Length[ss]}]]; z = Apply [ Times , S ] ; If[z ≠ 0, L = Table [l/p[i, tt[[i]]] , {i, 1, n} ] ; F = Table [f [tt[[i]]], {i, 1, n}]; h=F.L/. t -> 0; Show[ Plot[{f [t] , F.L/h), {t, -20, 20), PlotRange -> {{-25, 25} , {-10, 10}}] , Graphics[{Red, PointSize[Large], Point[Table[{ss[[i]], 0} , {i, 1, Length[tt] - 1}]] , Text[ToString[#] , {ss [[#]]+1.2 , 0}] &/@ Range [4] , Axes -> True} ] ] Show[Graphics[Text["Узлы совпадают"], PlotRange -> {{-25, 25}, {-20, 20}}]] ] {{ss, {-7.2, 0.7, 5.2, 12.0}, "Узлы"}, With[{r = Range[1, Length[tt] -1]}, Grid[ {Spacer [3] , Subscript [Style [" t" , Italic], # - 1] , Slider [Dynamic@ss[[.#l]] , {-20, 20, .01}, Appearance -> "UpArrow" , ImageSize -> {200, 12}], Dynamic@ss [[#1]] } & /@ r] ] &, ControlPlacement -> Bottom} , TrackedSymbols -> {ss} , SaveDef initions -> True ] ]
Задача 6.1.1. Обратите внимание, что разделенная разность быстро убывает при удалении вправо и влево от крайних узлов. Каков порядок этого убывания?
Задача 6.1.2. Написать программу, которая бы учитывала совпадение узлов.