Глава IV
4.3. Производные кривой NURBS

Производные рациональных функций сложные, включают знаменатели высоких степеней. В разделе 3.3 мы разработали формулы и алгоритмы для вычисления произ­водных не рациональных кривых B-сплайнов. Эти формулы и алгоритмы применяют­ся, конечно, к `C^w(u)`, так как это не рациональная кривая в четырехмерном простран­стве. В этом разделе мы разрабатываем формулы, выражающие производные `C(u)` в терминах производных `C^w(u)`.

Пусть

`C(u)={w(u)C(u)}/{w(u)}={A(u)}/{w(u)}`

где `A(u)` вектор-функция, координаты которой являются первые три координаты `C^w (u)` (`A(u)` является числитель уравнения [4.1]). Тогда

`C^'(u)=(w(u)A^'(u)-w^'(u)A(u))/{w(u)^2}` `=(w(u)A^'(u)-w^'(u)w(u)C(u))/{w(u)^2}=(A^'(u)-w^'(u)C(u))/{w(u)}`(4.7)

Так как `A(u)` и `w(u)` представляют собой координаты `C^w(u)`, получим их первые про­изводные по формулам (3.4) - (3.6). Мы вычисляем производные высших порядков, дифференцируя `A(u)`, используя правило Лейбница

`A^((k))(u)=(w(u)C(u))^((k))=sum_(i=0)^k((k),(i))w^((i))(u)C^((k-i))(u)` `=w(u)C^((k))(u)+sum_(i=1)^k((k),(i))w^((i))(u)C^((k-i))(u)`

из которого мы получаем

`C^((k))(u)=(A^((k))(u)-sum_(i=1)^k((k),(i))w^((i))(u)C^((k-i))(u))/{w(u)}` (4.8)

Уравнение (4.8) дает `k`ую производную `C(u)` в терминах `k`ой производной `A(u)`, и в первую очередь через `(k-1)`-й производных `C(u)` и `w(u)`. Производные `A^((k))(u)` и `w^((i))(u)` получают, используя либо уравнение (3.3) и алгоритм A3.2 или уравнение (3.8) и алгоритм A3.4.

Найдем выражения для первых производных кривой NURBS своими концами `(u=0,u=1)`. Из уравнения (3.7) мы имеем

`A^'(0)=p/u_(p+1)(w_1P_1-w_0P_0)`   `w^'(0)=p/u_(p+1)(w_1-w_0)`

из уравнения (4.7)

`C^'(0)=(p/u_(p+1)(w_1P_1-w_0P_0)-p/u_(p+1)(w_1-w_0)P_0)/w_0`

из которых следует

`C^'(0)=p/u_(p+1)w_1/w_0(P_1-P_0)`(4.9)

Аналогично   `C^'(0)=p/{1-u_(m-p-1)}w_(n-1)/w_0(P_n-P_(n-1))` (4.10)

Примеры

Пример4.2 Рассмотрим квадратичную рациональную круговую дугу Безье, приведенную в разделе 1.4 (рисунок 1.19b). Это кривая NURBS на векторе узлов `U={0,0,0,1,1,1}`, с `{P_i}={(1,0),(1,1),(0,1)}` и `{w_i}={1,1,2}`. Из уравнений (4.9) и (4.10) имеем

`C'(0)=2/1 1/1(P_1-P_0)=(0,2)`

`C'(1)=2/{1-0}1/2(P_2-P_1)=(-1,0)`

Из уравнения (4.7)

`C''(0)={A''(0)-2w'(0)C'(0)-w''(0)C(0)}/w_0`

Из уравнения (3.9) или уравнения (1.10)

`A''(0)=2(w_0P_0-2w_1P_1+w_2P_2`

и   `w''(0)=2(w_0-2w_1+w_2)`

Из `w'(0)=2(w_1-w_0)` следует, что

`C''(0)=2/w_0[w_0P_0-2w_1P_1+w_2P_2-4(w_1-w_0)(P_1-P_0)``-(w_0-2w_1+w_2)P_0]` `=2(P_0-2P_1+2P_2-P_)=4(P_2-P_1)=(-4,0)`

Вычисление `C''(1)` оставлено в качестве упражнения.

Теперь предположим, что `u` является фиксированной, и что нулевая через `d`ую производных `A(u)` и `w(u)` были вычислены и загружаются в массивах Aders и wders, соответственно, т.е., `C^w(u)` была дифференцирована и его координаты отделяют в Aders и wders. Алгоритм A4.2 вычисляет точку, `C(u)`, и производные, `C^((k))(u)`, `1≤k≤d`. Точка кривой возвращается в СК[0] и kая производная возвращается в СК[k]. Массив Bin[][] содержит предварительно вычисленный биномиальных коэффициентов (Bin[k][i] является `((k),(i))`).

Алгоритм А4.2

RatCurveDerivs(Aders,wders,d,CK)
{ /* Вычисление  производных  C(u)  из  производных  Cw(u) */
  /* Вход: Aders, wders, d  */
  /* Выход: CK */
  for (k=0; k<=d; k++)
   {
    v = Aders[k];
    for (i=l; i<=k; i++)
        v = v - Bin[k][i]*wders[i]*CK[k-i];
    CK[k] = v/wders[0];
    }
}    
        

Рисунок 4.7 показывает, первую, вторую и третью производные от кубической кривой NURBS. Производные векторы уменьшено на 0.4, 0.08 и 0.03, соответственно.

Рисунок 4.7. Первая, вторая и третья производные кубической кривой NURBS, вычисленные при `u=`1⁄2, с `w_3=`1⁄2 и `w_i=1`, `i!=3`.