Производные рациональных функций сложные, включают знаменатели высоких степеней. В разделе 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))`).
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`.