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.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 для обозначения проекции.
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; /* Делим на вес */ }