Глава IV
4.2. Определение и Свойства NURBS Кривых

NURBS Кривая `p`-ой степени определяется как

`C(u)=(sum_(i=0)^nN_(i,p)(u)w_i P_i)/(sum_(i=0)^nN_(i,p)(u)w_i)`   `a≤u≤b` (4.1)

где `{P_i}` являются контрольными точками (которые формируют управляющий много­угольник), `{w_i}` являются весами и `{N_(i,p)(u)}` являются базисными функциями B-спла­йнов `p`ой степени, определенных на непериодическом (и неоднородном) узловом векторе

`U="{"ubrace(a,…,a)_(p+1),u_(p+1),…,u_(m-p-1),ubrace(b,…,b)_(p+1)"}"`

Если не указано иное, мы предполагаем, что `a=0`, `b=1,` и `w_i>0` для всех `i`. установив

`R_(i,p)(u)=(N_(i,p)(u)w_i)/(sum_(j=0)^nN_(j,p)(u)w_j)` (4.2)

это позволяет нам переписать уравнение (4.1) в форме

`C(u)=sum_{i=0}^nR_(i,p)(u) P_i`(4.3)

Где `{R_(i,p)(u)}` рациональные базисные функции; они являются кусочно рациональными функциями на `u∈[0,1]`.

`R_(i,p)(u)` имеет следующие свойства, полученные из уравнения (4.2) и соответствующих свойств `N_(i,p)(u)`:

Св.4.1 Не отрицательность: `R_(i,p)(u)≥0` для всех `i`, `p`, и `u∈[0,1]`;
Св.4.2 Разбиение единицы: `∑_(i=0)^nR_(i,p)(u)=1` для всех `u∈[0,1]`;
Св.4.3 `R_(0,p)(0)=R_(n,p)(1)=1`;
Св.4.4 Для `p>0`, все `R_(i,p)(u)` достигают ровно один максимум на отрезке `u∈[0,1]`
Св.4.5 Локальная поддержка: `R_(i,p)(u)=0` для `u∉[u_i,u_(i+p+1))`. Кроме того, в любом данном узловом интервале, в крайнем случае `p+1` для `R_(i,p)(u)` отличны от нуля (в общем, `R_(i-p,p)(u),…,R_(i,p)(u)` отличны от нуля в `[u_i,u_(i+1))`;
Св.4.6 Все производные `R_(i,p)(u)` существуют в границах узлового интервала, где это рациональная функция с ненулевым знаменателем. На узле, `R_(i,p)(u)` `p-k` раз непрерывно дифференцируемые, где `k` является кратность узла;
Св.4.7 Если `w_i=1` для всех `i`, тогда `R_(i,p)(u)=N_(i,p)(u)` для всех `i`; то есть `N_(i,p)(u)` – это частный случай `R_(i,p)(u)`. Фактически, для любого `a≠0`, если `w_i=a` для всех `i` тогда `R_(i,p)(u)=N_(i,p)(u)` для всех `i`;
Из свойств Св.4.1-Св.4.7 выводятся следующие важные геометрические характеристики кривых NURBS:
Св.4.8 `C(0)=P_0` и `C(1)=P_n` это следует из Св.4.3;
Св.4.9 Аффинная инвариантность: аффинное преобразование применяемое к кри­вой, применяется к её контрольным точкам (см Св.3.4 раздел 3.1); Кривые NURBS также инвариантны относительно перспективных проекций ([Lee87; Pieg91a]), это является важным в компьютерной графике;
Св.4.10 Сильное свойство выпуклой оболочки: если `u∈[u_i,u_(i+1))`, то `C(u)` лежит в пределах выпуклой оболочки контрольных точек `P_(i-p),…,P_i` (рис 4.1, где `C(u)` для `u∈[1⁄4,1⁄2)`) (пунктирный сегмент) содержится в выпуклой оболочке `{P_1,P_2,P_3,P_4}`, пунктирная область); это следует из Св.4.1, Св.4.2 и Св.4.5;
Св.4.11 `C(u)` бесконечно дифференцируема в границах узловых интервалов и `p-k` раз дифференцируемые в узел кратности `k`;
Св.4.12 Свойство уменьшения измерения: нет плоскости имеющей больше пересе­чений с кривой, чем с контрольным многоугольником (замените слово “плоскость” на “линию”, для двумерных кривых);
Св.4.13 NURBS кривая без внутренних узлов является рациональной кривой Безье, поскольку `N_(i,p)(u)` сводятся к `B_(i,n)(u)`; сравните формулы (4.2) и (4.3) с уравнением (1.15). Из этого, вместе со Св.4.7, следует, что кривые NURBS содержат нерациональные B-сплайны и рациональные и нерациональные кривые Безье в качестве частных случаев;
Св.4.14 Локальная аппроксимация: если контрольная точка `P_i` перемещена, или вес `w_i` изменился, это влияет только на этот участок кривой на отрезке `u∈[u_i,u_(i+p+1))`; это следует из Св.4.5.

Рисунок 4.1. `U={0,0,0,0,`1⁄4,1⁄2,3⁄4`,1,1,1,1}` и `{w_0,...,w_6}={1,1,1,3,1,1,1}`. (a) Кубическая кривая NURBS; (b) связанные базисные функции.

Рисунок 4.2. Рациональные кубические кривые B-сплайна, с изменяющимся `w_3`.

Рисунок 4.3. Кубические базисные функции для кривых на рисунке 4.2.

(a) `w_3=1`; (b) `w_3=`3⁄10; (c) `w_3=0`.

Рисунок 4.4. Рациональные квадратичные кривые с переменным `w_1`.

Рисунок 4.5. Квадратичные базисные функции для кривых на рисунке 4.4.

(а) `w_1=4`; (b) `w_1=`3⁄10; (c) `w_1=0`.

Свойство Св.4.14 очень важно для интерактивного дизайна формы. Используя кривые NURBS, мы можем воспользоваться как управлением движением точки, так и модификацией веса, чтобы достичь локального управления формой. Рисунки 4.2-4.6 показывают эффекты модификации одного веса. Качество эффекта: Предположим, `u∈[u_i,u_(i+p+1))`; затем, если `w_i` увеличивается (уменьшается), точка `C(u)` приближает­ся к (удаляется от) `P_i` и, следовательно, кривая притягивается к (отталкивается от) `P_i`. Кроме того, движение `C(u)` для фиксированного `u` вдоль прямой линии (рис 4.6). На рисунке 4.6, `u` фиксирована и `w_3` меняется. Пусть

`B=C(u;w_3=0)`(4.4)

`N=C(u;w_3=1)`

Рисунок 4.6. Модификация веса `w_3`.

Тогда прямая определённая `B` и `N` проходит через `P_3`, и для любого `0<w_3<∞`, `B_3=C(u;w_3)` лежит на этом сегменте линии между `B` и `P_3`. Мы вернемся к этой теме в следующей главе.

Как и в случае рациональных кривых Безье, однородные координаты предлагают эффективный способ представления кривых NURBS. Пусть `H` будет перспективным отображением, заданное формулой (1.16). Для заданного набора контрольных точек, `{P_i}`, и весов, `{w_i}`, построить веса контрольных точек, `P_i^w=(w_ix_i,w_i y_i,w_iz_i,w_i)`. Затем определите нерациональную (кусочно-многочленную) кривую B-сплайна в четырехмерном пространстве как

`C^w(u)=sum_(i=0)^nN_(i,p)(u)P_i^w`(4.5)

Применяя перспективную карту, `H`, на `C^w(u)` дает соответствующую рациональную B-сплайн кривую (кусочно рациональную в трехмерном пространстве)

`C(u)=H{C^w(u)}=H{sum_(i=0)^nN_(i,p)(u)P_i^w}=(sum_(i=0)^nN_(i,p)(u)w_iP_i)/(sum_(i=0)^nN_(i,p)(u)w_i)=R_(i,p)(u)P_i`

Мы имеем в виду попеременно либо `C^w(u)` или `C(u)` в качестве кривой NURBS, хотя, строго говоря, `C^w(u)` не является рациональной кривой.

Примеры

Пример4.1 Пусть `U={0,0,0,1,2,3,3,3}`, `{w_0,...,w_4}={1,4,1,1,1}`, `{P0,...,P4}={(0,0),(1,1),(3,2),(4,1),(5,-1)}`. Вычисляем точку на рациональной кривой B-сплайна при `u=1`. Теперь и находится в пролете узла `[u_3,u_4)`, и

`N_{3,0}(1)=1`

`N_{2,1}(1)={2-1}/{2-1}N_{3,0}(1)=1`

`N_{3,1}(1)={1-1}/{2-1}N_{3,0}(1)=0`

`N_{1,2}(1)={2-1}/{2-0}N_{2,1}(1)=1/2`

`N_{2,2}(1)={1-0}/{2-0}N_{2,1}(1)=1/2`

`N_{3,2}(1)=0`

Следовательно

`C^w(1)=1/2P_1^w+1/2P_2^w=1/2(4,4,4)+1/2(3,2,1)=(7/2,3,5/2)`

Проектирование даёт

`C(1)=(7/5,5/6)`

Алгоритм A4.1 вычисляет точку на рациональной кривой B-сплайна при фиксиро­ванном значении `u`. Он основан на уравнении (4.5), т.е., он предполагает, взвешенные контрольные точки в массиве Pw (как и все алгоритмы в оставшейся части этой книги, если не указано иное). Таким образом, Pw[i] содержит `P_i^w=(w_ix_i,w_iy_i,w_iz_i,w_i)`. Cw обозначает четыре координаты точки на `C^w(u)`, и С трехмерная точка на `C(u)` (выход). Для остальной части книги мы используем обозначение С=Cw/w для обозначения проекции.

Алгоритм А4.1

CurvePoint(n,p,U,Pw,u,C)
{ /* Вычисление  точки  на  рациональной  B-сплайн  кривой */
  /* Вход: n,p,U,Pw,u  */
  /* Выход: С */
span = FindSpan(n,p,u,U);
BasisFuns(span,u,p,U,N);
Cw = 0.0;
for (j=0; j<=p; j++)
    Cw = Cw + N[j]*Pw[span-p+j];
С = Cw/w;      /*    Делим  на  вес    */
}