Кривая `C(u)` является вектор-функция одного параметра. Это отображение (деформации) сегмента прямой линии в евклидовом трехмерном пространстве. Поверхность вектор-функция двух параметров, `u` и `v`, и представляет собой отображение области, `R`, `uv` плоскости в евклидовом трехмерном пространстве. Таким образом, она имеет вид `S(u,v)=(x(u,v),y(u,v),z(u,v))`, `(u,v)∈R`. Есть много схем для представления поверхностей. Они отличаются в координатных функциях, используемых в типах областей `R`. Наверное, самый простой метод, и одним из наиболее широко используемых в геометрических приложениях моделирования, является схема тензорного произведения. Это метод, который мы используем в оставшейся части этой книги.
Метод тензорного произведения основан на схеме двунаправленной кривой. Он использует базисные функции и геометрические коэффициенты. Базисные функции двумерной функции `u` и `v`, которые построены в виде продуктов одномерных базисных функций. Геометрические коэффициенты расположены (топологически) в двух направлениях, `n×m` сети. Таким образом, поверхность тензорного произведения имеет вид
`S(u,v)=(x(u,v),y(u,v),z(u,v))=sum_{i=0}^n sum_{j=0}^mf_i(u)g_i(v)b_(i,j)` (1.20)
где `{(b_{i,j}=(x_{i,j},y_{i,j},z_{i,j})),(0<=u","v<=1):}`
Обратите внимание, что домен `(u,v)` отображается как квадрат (в общем прямоугольником). Отметим также, что `S(u,v)` имеет матричную форму
`S(u,v)=[f_i(u)]^T[b_{i,j}][g_i(v)]`
где `[f_i(u)]^T` это `(1)×(n+1)` строчный вектор, `[g_i(v)]` вектор с `(m+1)×(1)` колонок, и `[b_{i,j}]` это `(n+1)×(m+1)` матрица трёхмерных точек.
В качестве примера рассмотрим степенную базисную поверхность
`S(u,v)=sum_{i=0}^nsum_{j=0}^ma_{i,j}u^iv^j=[u^i]^T[a_{i,j}][v^j]` `{(a_{i,j}=(x_{i,j},y_{i,j},z_{i,j})),(0<=u","v<=1):}`(1.21)
Мы имеем `f_i(u)=u^i` и `g_i(v)=v^j`, и базисные функции как результат, `{u^iv^j}`. Если мы зафиксируем `u=u_0`, тогда
`C_{u_0}(v)=S(u_0,v)=sum_{j=0}^m sum_{i=0}^n a_{i,j} u_0^i v^j =sum_{j=0}^m b_j(u_0)v^j` (1.22)
где `b_j(u_0)=sum_{i=0}^na_{i,j}u_0^i`
это степенная базисная кривая лежащая на поверхности, `S(u,v)`. Кроме того, `C_{v_0}(u)` это степенная базисная кривая лежащая на `S(u,v)`; и кривые `C_{u_0}(v)` и `C_{v_0}(u)` пересекаются в точке на поверхности, `S(u_0,v_0)`. Эти кривые называются изопараметрические кривые (или изокривые). `C_{u_0}(v)` называются `v` кривая, `C_{v_0}(u)` называются `u` кривая (смотри рис 1.23).
Выражение (1.21) может быть записано
Рисунок 1.23. Поверхность тензорного произведения с изопараметрическими кривыми.
`S(u,v)=ubrace({a_{0,0}+a_{0,1}v+a_{0,2}v^2+⋯+a_{0,m}v^m})_(b_0)`
`+u ubrace({a_{1,0}+a_{1,1}v+a_{1,2}v^2+⋯+a_{1,m}v^m})_(b_1)`
`+u^2 ubrace({a_{2,0}+a_{2,1}v+a_{2,2}v^2+⋯+a_{2,m}v^m})_(b_2)`
`vdots`
`+u^n ubrace({a_{n,0}+a_{n,1}v+a_{n,2}v^2+⋯+a_{n,m}v^m})_(b_n)`
`=b_0+b_1 u+b_2 u^2+⋯+b_n u^n`
Члены в фигурных скобках простые многочлены, которые могут быть вычислены алгоритмом Горнера (А1.1), уступив `b_0,b_1,…,b_n`. Используя `bs` и перезапуская алгоритм, мы получаем точку на поверхности. Таким образом, у нас есть алгоритм 1.6.
Horner2(a,n,m,u0,v0,S) { /* Вычисление точку на степенной базисной поверхности. */ /* Вход: a,n,m,u0,v0 */ /* Выход: S */ for (i=0; i<=n; i++) Horner1(a[i][],m,v0,b[i]); /* a[i][] это i-тая строка */ Horner1(b,n,u0,S);
Алгоритм А1.6 это обычный алгоритм поверхностей тензорного произведения. Они, как правило, могут быть получены путем расширения от алгоритмов кривой, часто путем обработки `n` (или `m`) строк коэффициентов (в виде кривых) в одном направлении, и дальнейшей обработки одной или несколько строк в другом направлении.
Дифференцируя уравнение (1.21), получаем
`S_u(u,v)=sum_{i=0}^nsum_{j=0}^mia_{i,j}u^{i-1}v^j` `S_v(u,v)=sum_{i=0}^nsum_{j=0}^mja_{i,j} u^iv^{j-1}`
Обратите внимание, что при фиксированном `(u_0,v_0)`, `S_u(u_0,v_0)=C_(v_0)'(u_0)` и `S_v(u_0,v_0)=C_(u_0)'(v_0`). Нормальный вектор, `N`, вычисляется по формуле (1.4).
Нерациональные поверхности Безье получаются путем двухмерной сети контрольных точек и продуктов одномерных многочленов Бернштейна
`S(u,v)=sum_{i=0}^nsum_{j=0}^mB_{i,n}(u)B_{j,m}(v)P_{i,j}` `0<=u","v<=1` (1.23)
Базисная функция `B_0,2(u)B_1,3(v)` показана на рис 1.24а, и рис 1.24б показаны квадратная×кубическая поверхность Безье
Рисунок 1.24. (а) Базисная функция тензорного произведения Безье, `B_{0,2}(u)B_{1,3}(v)`; (б) квадратичная х кубическая поверхность Безье..
Для фиксированного `u=u_0`
`C_(u_0)(v)=S(u_0,v)=sum_{i=0}^nsum_{j=0}^mB_{i,n}(u_0)B_{j,m}(v)P_{i,j}`
`=sum_{j=0}^mB_{j,m}(v)(sum_{i=0}^nB_{i,n}(u_0)P_{i,j})`
`=sum_{j=0}^mB_{j,m}(v)Q_j(u_0)` (1.24)
где `Q_j(u_0)=sum_{i=0}^nB_{i,n}(u_0)P_{i,j}` `j=0,…,m`
это кривая Безье лежащая на поверхности. Аналогично, `C_{v_0}(u)=sum_{i=0}^nB_{i,n}(u)Q_i(v_0)` является `u` изокривой Безье лежащей на поверхности.
Как и в случае кривых, из-за их превосходных свойств Безье поверхности лучше подходят для геометрических приложений моделирования, чем степенные базисные поверхности. В частности,
Интересно отметить, что не существует никаких известных уменьшения вариации свойств для поверхностей Безье.
Алгоритм де Кастельжо (А1.5) также легко расширяется для вычисления точек на поверхности Безье. Обратимся к формуле (1.24) и рис 1.25. Пусть `(u_0,v_0)` фиксированы. При фиксированном `j_0`, `Q_{j_0}(u_0)=∑_{i=0}^nB_{i,n}(u_0)P_{i,j_0}` точка, полученная путем применения алгоритма де Кастельжо к `j_0` ряд контрольных точек, то есть до `{P_{i,j_0}}`, `i=0,…,n`. Поэтому, применяя алгоритм де Кастельжо `(m+1)` раз дает `C_{u_0}(v)`; и применяя его еще раз, чтобы `C_{u_0}(v)` на `v=v_0` даёт `C_{u_0}(v)=S(u_0,v_0)`. Этот процесс требует
Рисунок 1.25. Алгоритм де Кастелжо для поверхности Безье.
`{n(n+1)(m+1)}/2+{m(m+1)}/2` (1.25)
линейной интерполяции (смотри Упражнение 1.21). В силу симметрии, мы можем вычислить {C_{v_0}(u)} впервые (`n+1` приложения де Кастельжо), а затем вычислить `C_{v_0}(u)=S(u_0,v_0)}. Это требует
`{m(n+1)(m+1)}/2+{n(n+1)}/2` (1.26)
линейной интерполяции. Таким образом, если `n>m` вычисление первым `C_{v_0}(u)`, а затем `C_{v_0}(u_0)`; в противном случае, вычислить сначала `C_{u_0}(v)`, а затем `C_{u_0}(v_0)`.
deCasteljau2(P,n,m,u0,v0,S) { /* Вычисление точку на поверхности Безье. */ /* по де Кастельжо */ /* Вход: P,n,m,u0,v0 */ /* Выход: S */ If (n <= m) { for (j=0; j<=n; j++) /* P[j][] это j-тая строка */ deCasteljau1(P[j][],n,u0,Q[j]); deCasteljau1(Q,m,v0,S); } else { for (i=0; i<=n; i++) deCasteljau1(P[][i],m,v0,Q[j]); deCasteljau1(Q,n,u0,S); } }
Определим рациональную поверхность Безье для перспективной проекции из четырехмерного многочлена поверхности Безье (смотри [Pieg86; Fari89])
`S^w(u,v)=sum_{i=0}^nsum_{j=0}^mB_{i,n}(u_0)B_{j,m}(v)P_{i,j}^w` (1.27)
и `S(u,v)=H{S^w(u,v)}={sum_{i=0}^nsum_{j=0}^mB_{i,n}(u)B_{j,m}(v)w_{i,j}P_{i,j}}/{sum_{i=0}^nsum_{j=0}^mB_{i,n}(u)B_{j,m}(v)w_{i,j}}`
`=sum_{i=0}^nsum_{j=0}^mR_{i,n}(u,v)P_{i,j}` (1.28)
где `R_{i,n}(u,v)={B_{i,n}(u)B_{j,m}(v)w_{i,j}}/{sum_{r=0}^nsum_{s=0}^mB_{r,n}(u)B_{s,m}(v)w_{r,s}}`
Обратите внимание, что `R_{i,n}(u,v)` являются рациональными функциями, но они не являются продуктами других базисных функций. Следовательно, `S(u,v)` не поверхность тензорного произведения, но есть `S^w(u,v)`. Как с кривыми, мы как правило, работают с формулой (1.27) и проецируем результат. Рисунок 1.26a показывает рациональную базисную функцию, а на рис 1.26б изображает квадратичную×кубическую рациональную поверхность Безье. Сравните эти рисунки с рисунками 1.24а и 1.24б.
Предполагая, `w_{i,j}>0` для всех `i` и `j`, свойств, перечисленных ранее для нерациональных поверхностей Безье (и функции продукта `B_{i,n}(u)B_{j,m}(v)` естественно распространяются для рациональных поверхностей Безье. Кроме того, если `w_{i,j}=1` для всех `i` и `j`, тогда `R_{i,n}(u,v)=B_{i,n}(u)B_{j,m}(v)`, и соответствующая поверхность нерациональная.
Рисунок 1.26. (а) Рациональная базисная функция `R_{0,i}(u, v)` (где `w_{0,1}=5` и все остальные веса равны единице); (б) квадратичная `xx` кубическая рациональная поверхность Безье.
Примеры
Пример1.15 | Давайте построим цилиндрическую лоскутную поверхность. Из раздела 1.4 мы
знаем, что
`C^w(u)=sum_{i=0}^2B_{i,2}(u)P_i^w` Для `{P_i^w}={(0,1,0,1),(0,1,1,1),(0,0,2,2)}`, это круговая дуга в плоскости `yz`. Используя перенос (Св.1.14, Раздел 1.4)`C_0^w(u)=sum_{i=0}^2B_{i,2}(u)P_{i,0}^w` `C_1^w(u)=sum_{i=0}^2B_{i,2}(u)P_{i,1}^w` где `{P_{i,0}^w}={(1,1,0,1),(1,1,1,1),(2,0,2,2)}` и `{P_{i,1}^w}={(-1,1,0,1),(-1,1,1,1),(-2,0,2,2)}` круговые дуги в плоскостях `x=1` и `x=-1`, соответственно (рис 1.27). Линейная интерполяция между `C_0^w` и `C_1^w` дает цилиндрическую поверхность, т.е.Рисунок 1.27. Цилиндрическая поверхность как рациональная поверхность Безье. `S^w(u,v)=sum_{i=0}^2sum_{j=0}^1B_{i,2}(u)B_{j,1}(v)P_{i,j}^w` При фиксированном `u=u_0`, `C_{u_0}^w(u)=∑_{j=0}^1B_{j,1}(v)Q_j^w(u_0)` является отрезок прямой из `C_0^w(u_0)` в `C_1^w(u_0)` параллельно `x`-оси. Для фиксированного `v=v_0`, `C_{v_0}^w(u)=S^w(u,v_0)=∑_{i=0}^2B_{i,2}(v)Q_i^w(v_0)` круговая дуга в плоскости `x=(1-v_0)(1)+v_0(-1)=1-2v_0`. Теперь вычислим точку `S(1⁄2,1⁄2)`, используя алгоритм A1.7. Обратите внимание, что `n>m`. Во-первых получить `C_(v_0=1⁄2)^w(u)`
`S(1/2,1/2)=H{(0,3/4,1,5/4)}=(0,3/5,4/5)` |
Упражнения
(1) | 90° вращение вокруг центра координат. Матрица поворота (применяется слева) является |
`[[0,-1],[1,0]]` | |
(2) | перенос по вектору `(-1,-1)` |
`C(u)=sum_{i=0}^nB_{i,n}(u)P_i` `u in [0,1]`
Пусть `v in [a,b]`. Тогда `u=(v-a)/(b-a)`. Подставьте это уравнение в уравнение (1.8) и вывести это выражение для репараметризованной кривой`C(v)=1/(b-a)^nsum_{i=0}^nn!/{i!(n-i)!}(v-a)^i(b-v)^{n-i}P_i`
Интересно отметить, что контрольные точки не меняются, только базисные функции. Повторная параметризация степенной базисной формы изменяет геометрические коэффициенты, но не базисные функции.`C(u)=({1-u^2}/{1+u^2},{2u}/{1=u^2})`
Определите, какие диапазоны параметров дают какие квадранты круга. Дают ли эти уравнения весь круг? Что вы можете сказать о параметризации?`C(u)=({1+(sqrt 2-2)u+(1-sqrt 2)u^2}/{1+(sqrt 2-2)u+(2-sqrt 2)u^2},{sqrt 2/2 u((sqrt 2 - 2)u +2)}/{1+(sqrt 2-2)u+(2-sqrt 2)u^2})`
Определить рациональное представление Безье, соответствующее этим уравнениям. Подсказка: `P_i` должен быть таким же, как и раньше - `(1,0)`, `(1,1)`, `(0,1)`; Зачем? Вычислите веса `w_i`, уравняв многочлены и подставив `u=0,1⁄2,1`, как было сделано ранее. Вычислите точку `С(1⁄2)`, используя любой метод. Что интересного в `С(1⁄2)`?`{P_{i,0}}={(0,0,0),(3,0,3),(6,0,3),(9,0,0)}`
`{P_{i,1}}={(0,2,2),(3,2,5),(6,2,5),(9,2,2)}`
`{P_{i,2}}={(0,4,0),(3,4,3),(6,4,3),(9,4,0)}`
`S(u,v)=sum_{i=0}^nsum_{j=0}^mB_{i,n}(u)B_{j,m}(v)P_{i,j}`
и предположим, что `P_{0,0}=P_{1,0}=cdots=P_{n,0}`. Как это влияет на `S(u,v)`, производные `S_u(u,v)` и `S_v(u,v)` и Кривые `C_{v_0}(u)`? Предположим, что `P_{i,0}=(1,0,0)` для `i = 0,1,2` в Примере1.15, с `w_{0,0}=1`, `w_{1,0}=1`,`w_{2,0}=2`. Какой тип поверхность вы получаете?`S^w(u,v)=[B_{i,n}(u)]^T[P_{i,j}^w][B_{j,m}(v)]=[u^i]^TM_n[P_{i,j}^w]M_m^T[v^j]`
где `[u^i]^T` и `[v^j]` - векторы, `M_n` это `(n+1)xx(n+1)` матрица, `M_m^T` это `(m+1)xx(m+1)` матрица и `[P_{i,j}^w]` это `(n+1)xx(m+1)` матрица четырехмерных точек. Запишите эту форму явно для примера цилиндрической поверхности, пример 15. Используя эту матричную форму, вычислите точку `S^w(1⁄2,1⁄2)`, а затем спроецировать для получения `S(1⁄2,1⁄2)`. Для `S(u,v)` не существует прямой матричной формы, почему бы и нет?