Опубликован: 27.12.2010 | Уровень: специалист | Доступ: платный
Лекция 6:

Кривые и поверхности в компьютерной геометрии, II

Аннотация: В лекции рассматриваются бета-кривые; поверхности, определяемые матрицами опорных точек и весов и поверхности, затягивающие заданные граничные контуры.

B-кривые (бета-кривые)

Основными недостатками кривых Безье являются следующие:

  1. смещение любой опорной точки глобально влияет на всю кривую;
  2. сложно обеспечить точное прохождение кривой через заданные точки (кроме крайних опорных точек, являющихся концами кривой).

Поэтому при работе с кривыми Безье часто приходиться прибегать к делению кривой Безье, т. е. по сути дела - к замене одной кривой другими. Поэтому естественным образом возникает задача построения такого класса кривых, который бы позволял избежать недостатков 1), 2) и решать соответствующие задачи управления кривой путем изменения управляющих параметров кривой, а не путем ее замены на другие кривые.

Вспомним, что рациональная кривая Безье, построенная по точкам p_0, \dots, p_n с весами \omega_0, \dots , \omega_n, определялась формулой

r_0(t;n)=\frac{\sum_{i=0}^{n}C_n^it^i(1-t)^{n-i} \omega_ip_i}{\sum_{i=0}^n C_n^it^i(1-t)^{n-i} \omega_i}=\frac{\sum_{i=0}^n B_i^n(t) \omega_ip_i}{\sum_{i=0}^n B_i^n(t) \omega_i}, ( 6.1)

где \{B_i^n(t) = C_n^ii t^i (1 -t)^{n-i}\} - базис Бернштейна на [0,1].

Из формулы (6.1) видно, что глобальное влияние каждой опорной точки p_i на всю кривую происходит из-за того, что каждая из функций B_i^n не равна нулю на всем интервале (0,1). Если бы вместо функций Бернштейна в формуле (6.1) выступали функции с локальными носителями, существенно меньшими, чем область определения параметра кривой t, то удалось бы как локализовать влияние отдельной точки на всю кривую, так и добиться (за счет выбора таких функций) прохождения кривой через некоторую заданную точку.

Поэтому поставим задачу следующим образом. Пусть даны опорные точки p_1,\dots., p_n с весами \omega_1,\dots ,\omega_n. Определим кривую r(t) по формуле

r(t)=\frac{\sum_{i=1}^nN_i(t) \omega_ip_i}{\sum_{i=1}^nN_i(t) \omega_i}, t_{min} \le t \le t_{max}, ( 6.2)

где N_i ( t) - набор кусочно-полиномиальных функций таких, что

  1. N_i (t) = 0 при t\notin [a_i, b_i]\subset  [t_{min}, t_{max}] ;
  2. для любой гладкой функции f(t) существует линейная комбинация \sum c_iN_i(t) , интерполирующая функцию f(t) в заданных узлах \{t_i\}_{i=1}^n

    f(t_i)=\sum_{j=1}^nc_jN_j(t_i), i=1, \dots, n;
  3. \sum_{i=1}^nN_i (t) = 1 для каждого t \in  [t_{min},t_{max}].

Последнее условие вводится для того, чтобы в случае совпадения всех опорных точек кривая превращалась бы в ту же точку.

Решение поставленной задачи основывается на понятии разделенных разностей и называется В-кривой. В-кривые обобщают кривые Безье.

Разделенные разности

Пусть имеется гладкая на каждом отрезке [t_i,t_{i+1}] функция f(t) и фиксированы некоторые значения t_1, \dots , t_{m+1} переменной t (не обязательно различные и не обязательно упорядоченные по возрастанию или убыванию t ). Мы также будем рассматривать переменное значение t, которое будем считать первым в последовательности. Поскольку оно предшествует значению t_1, припишем ему индекс 0 (хотя в большинстве случаев будем обозначать его просто t без индекса): t_0 = t, t_1, \dots, t_{m+1}. Обозначим f_i = f(t_i), f_t = f(t) = f(t_0) = f_0. Определим оператор правого сдвига E:

Et_i = t_{i+1},\\
Ef_i = f_{i+1}\\
 (0 \le i \le m).

Определение 6.1.1. Разделенной разностью функции f(t) в узле t_i порядка k \le m - i + 1 называется величина

R^{(k)}f_i=\frac{R^{(k-1)}(E-1)f_i}{(E^k-1)t_i}=\frac{R^{(k-1)}f_{i+1}-R^{(k-1)}f_i}{t_{i+k}-t_i},\\
R^{(0)}f_i=f_i. ( 6.3)

Разделенная разность является дискретным аналогом операции дифференцирования соответствующего порядка.

При этом если t_i = t_{i+1} = \dots = t_{i+k}, то в правой части (6.3) появляется отношение вида \frac 00, которое по определению полагается равным

R^{(k)}f_i=lim_{\delta_1, \dots, \delta_k \to 0, \delta_i > 0} R_{\delta_1, \dots, \delta_k}^{(k)}f_i

где R_{\delta_1, \dots, \delta_k}^{(k)}f_i определяется по возмущенным узлам \tilde t_{i+j}=t_i+\delta_1 + \dots, + \delta_j, где 1 \le j \le k, \delta_j > 0 .

Теорема 6.1. Если t_i = t_{i+1} = \dots = t_{i+k}, то

Пример 6.1.1. Разделенная разность пятого порядка функции cos\ (t) как функция первого узла (программа не вычисляет производные при совпадении узлов):

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. Написать программу, которая бы учитывала совпадение узлов.

Светлана Петрова
Светлана Петрова
Украина
Марина Семенова
Марина Семенова
Россия, г. Чебоксары