Опубликован: 27.12.2010 | Доступ: свободный | Студентов: 813 / 130 | Оценка: 5.00 / 5.00 | Длительность: 18:38:00
ISBN: 978-5-9556-0117-5
Специальности: Математик
Лекция 6:

Кривые и поверхности в компьютерной геометрии, II

Поверхности Лагранжа. Аналогично интерполяционной кривой Лагранжа, можно построить поверхность Лагранжа, затягивающую заданный остов кривых (6.20). Эта поверхность описывается радиус-вектором

r(u,v)=\sum_{i=0}^n L_i(v)r(u,i),\\
u_0 \le u \le u_1,\\
0 \le v \le n

где

L_i(v)=\frac{\Pi_{j=0, j \ne i}^{n}(v-j)}{\Pi_{j=0, j \ne i}^{n}(i-j)}

Последняя формула получается из формулы для коэффициентов интерполяционного полинома Лагранжа подстановкой t_i = i (0 \le i \le  n) .

Поверхность Лагранжа имеет те же недостатки, что и интерполяционный полином Лагранжа - необоснованные изгибы при неравномерном расположении кривых остова в пространстве. По параметру v поверхность будет бесконечно гладкой и представляет собой многочлен. Гладкость по параметру u зависит от гладкости кривых остова.

Поверхности Гордона. Пусть задан остов поверхности, состоящий из двух семейств кривых в обоих параметрических направлениях, которые образуют сетку - т. е. каждая кривая одного семейства пересекает в одной и только одной точке каждую кривую другого семейства. Различные кривые одного и того же семейства не пересекаются. Обозначим заданную таким образом сетку кривых через

r = r(u,0), \dots ,r = r(u,n)        \mbox{(первое семейство)},\\
r = r(0,v), \dots ,r = r(m,v)       \mbox{ (второе семейство)}. ( 6.21)

Здесь 0 \le u \le  m, 0 \le v \le n. Радиус-вектор точки пересечения j -й кривой первого семейства с i -й кривой второго семейства равен r(i,j), 0 \le i \le m,

Определение 6.3.3. Поверхностью Гордона, затягивающей сетку кривых (6.21), называется поверхность

r(u,v)=\sum_{j=0}^nL_j^n(v)r(u,j)+ \sum_{i=0}^m L_i^m(u)r(I,v)-\\
- \sum_{i=0}^m \sum_{j=0}^nL_i^m(u)L_j^n(v)r(i,j),\\
0 \le u \le m,\\
0 \le v \le n, ( 6.22)

где

L_i^m(u)=\frac{\Pi_{r=0, r \ne 0}^m(u-r)}{\Pi_{r=0, r \ne 0}^m(i-r)},\\
L_j^n(v)=\frac{\Pi_{s=0, s \ne j}^n(v-s)}{\Pi_{s=0, s \ne 0}^n(j-s)} ( 6.23)

- коэффициенты Лагранжа.

Обобщенная поверхность Гордона задается формулой (6.22), в которой вместо коэффициентов Лагранжа (6.23) используются произвольные C^1 -функции \alpha_k(w) , которые в целых точках соответствующего промежутка удовлетворяют условию

\begin{cases}
1, \mbox{если } w=k,\\
0, \mbox{если } w \ne k
\end{cases}

Например, в качестве \alpha_k(w) можно взять функции смещения (6.19). Гладкость обобщенной поверхности Гордона зависит от гладкости используемых функций \alpha_k(w) . Поверхности Гордона, построенные по коэффициентам Лагранжа, имеют гладкость C^{\infty}, но могут образовывать необоснованные изгибы.

Поверхности, затягивающие сетку кривых заплатами Кунса. Остов, состоящий из сетки кривых (6.21), можно затянуть поверхностью, состоящей из заплат, затягивающих каждую отдельную ячейку сетки и гладко сопрягающихся между собой. В качестве таких заплат могут выступать поверхности Кунса. Получается следующая поверхность:

r(u,v)=(\alpha_0(t) \alpha_1(t) \beta_0(t) \beta_1(t)) \left (\begin{matrix}
r(i,v)\\
r(i+1,v)\\
r_u(i, v)\\
r_u(i_1,v)
\end{matrix} \right )+\\
+(\alpha_0(w) \alpha_1(w) \beta_0(w) \beta_1(w)) \left (\begin{matrix}
r(u,j)\\
r(u, j+1)\\
r_v(u,j)\\
r_v(u,j+1)
\end{matrix} \right )-\\
(\alpha_0(t) \alpha_1(t) \beta_0(t) \beta_1(t)) \times\\
\times  \begin{pmatrix}
r(i,j)& r(i,j+1) & r_v(i,j) & r_v(i,j+1)\\
r(i+1,j)& r(i+1, j+1)& r_v(i+1,j)& r_v(i+1, j+1)\\
r_u(I,j)& r_u(i,j+1)& r_{uv}(i,j)& r_{uv}(i,j+1)\\
r_u(i+1,i)& r_u(i+1,j+1)& r_{uv}(i+1,j)& r_{uv}(i+1,j+1)
\end{pmatrix}  \times\\
\times \begin{pmatrix}
\alpha_0(w)\\
\alpha_1(w)\\
\beta_0(w)\\
\beta_1(w)
\end{pmatrix}
( 6.24)

t = u ? i, w = v ? j, 0 \le u \le m, 0 \le v \le  n. Здесь i = [u] - целая часть u, j = [v] - целая часть v,t = u-i =\{u\} - дробная часть u, w = v - j = \{v\} - дробная часть v, t,w \in  [0,1) - местные параметры в данной ячейке сетки (6.21). Согласно (6.21), области изменения параметров u и v таковы: 0 \le u \le m, 0 \le v \le n.

Для вычисления радиус-вектора поверхности с помощью формулы (6.24) необходимо задать производные на кривых сетки в трансверсальном направлении к этим кривым. По аналогии с кубическими сплайнами Эрмита, это можно сделать, например, по следующим формулам:

r_u(i,v)=\frac{r(i+1,v)-r(i-1,v)}{2},\\
r_v(u,j)=\frac{r(u,i+1)-r(u,j-1)}{2}

при 1 \le u \le m - 1, 1 \le v \le n - 1 (т. е. для внутренних линий сетки) и по формулам

r_u(0, v) = 2r(1, v) - 2r(0, v) - r_u(1, v),\\
r_u(m, v) = 2r(m, v) - 2r(m - 1, v) - r_u(m - 1, v),\\
r_v(u,0) = 2r(u, 1) - 2r(u, 0) - r_v(u, 1),\\
r_v (u, n) = 2r(u, n) - 2r(u, n - 1) - r_v (u, n - 1) ( 6.25)

для крайних линий сетки.

Геометрически это означает, что производная r_u(i,v) в произвольной точке r(i,v) внутренней линии сетки полагается пропорциональной вектору, соединяющему точки r(i - 1,v) и r(i + 1,v) на соседних с ней линиях сетки, отвечающие тому же значению параметра v, что и данная точка. Аналогичное утверждение справедливо и для производной r_v(u,j) .

Так же как и в случае кубических сплайнов Эрмита, формулы (6.25) обеспечивают равенство нулю третьих производных поверхности на границе в трансверсальном к граничной кривой направлении.

Поверхности тензорного произведения. Рассмотрим обобщенную поверхность Гордона (6.22), построенную по сетке кривых, которые являются кубическими сплайнами Эрмита. Ясно, что такая поверхность целиком определяется узлами сетки и первыми производными в узлах, заданными в обоих параметрических направлениях (поскольку этими величинами целиком определяются кубические сплайны Эрмита, являющиеся кривыми сетки). Таким образом, в данном случае поверхность строится фактически не по сетке кривых, а по набору точек (узлов) с заданными в них производными. Такие поверхности называются поверхностями тензорного произведения.

Для того чтобы получить формулу поверхности тензорного произведения, поставим в формулу (6.22) выражения, определяющие кубические сплайны Эрмита (линии сетки) и их производные по u и v:

r(i,v) =\alpha_0(w)r(ij) + \alpha_1(w)r(i,j + 1) + \beta_0(w)r_v(i,j)+ \beta_1(w)r_v(i,j + 1),\\
r(u,j) = \alpha_0(t)r(i,j) + \alpha_1(t)r(i + 1, j) + \beta_0(t)r_u(i, j)+ \beta_1(t)r_u(i+1,j),\\
ru(i,v) = \alpha_0(w)r_u(ij) + \alpha_1(w)r_u(i, j + 1) + \beta_0(w)r_{vu}(ij)+ \beta_1(w)r_{vu}(i,j + 1),\\
r_v(u,j) = \alpha_0(t)r_v(i,j) + \alpha_1(t)r_v(i+1,j)+\beta_0(t)r_{uv}(i,j)+\beta_1(t)r_{uv}(i + 1,j), ( 6.26)

где, напомним:

\alpha_0(x) = 1 - 3x^2 + 2x^3,\\
\alpha_1(x) = 3x^2-2x^3,\\
\beta_0(x) = x-2x^2+x^3,\\
\beta^1(x) = -x^2 + x^3,

где x \in [0,1] - местный параметр. В формулах (6.26) через i и j обозначены целые части параметров u и v соответственно. Местные параметры t и w определяются как t = u - i, w = v - j. Вторые две формулы в (6.26) получаются дифференцированием формулы (6.22). После подстановки формул (6.26) в (6.22) и несложных алгебраических преобразований получим следующее выражение для радиус-вектора поверхности тензорного произведения (в матричных обозначениях):

r(u,v) = ( \alpha_0(t)   \alpha_1(t)    \beta_0(t)   \beta1(t) )\times\\
\begin{pmatrix}
r(i,j)&r(i,j + 1)& r_v(i,j)& r_v(i,j + 1)\\
r(i + 1,j)& r(i + 1j + 1)& r_v(i + 1j)& r_v (i+1,j + 1)\\
r_u(i,j)& r_u(i,j + 1)& r_{uv}(i,j)& r_{uv}(i,j + 1)\\
r_u(i + 1,j)& r_u(i + 1,j + 1)&r_{uv}(i + 1,j)& r_{uv}(i + 1,j + 1) 
\end{pmatrix} \times\\
\times \begin{pmatrix}
\alpha_0(w)\\
\alpha_1(w ) \\
\beta_0(w)\\
\beta_1(w)
\end{pmatrix}, 
t = u-i,     w = v-j,     \\
0 \le u \le m,\\
0 \le v \le n. ( 6.27)

Из формулы (6.27) хорошо видно, что поверхность тензорного произведения определяется величинами, заданными лишь в узлах сетки.

Поверхности с треугольной параметрической областью

При триангуляции поверхностей иногда бывает удобно рассматривать криволинейные поверхности треугольной формы, имеющие в качестве параметрической области треугольник на плоскости. При этом удобно пользоваться не декартовыми, а барицентрическими параметрическими координатами.

Барицентрические координаты

Лемма 6.6. Пусть даны три точки A, B, C \in R^2, не лежащие на одной прямой. Тогда для любой точки P \in R^2 существует единственная тройка чисел \{a, b, c\} таких, что

\begin{cases}
r_P= ar_A + br_B + cr_C, \\
 a + b + c=1.
\end{cases}

Здесь через r_P, r_A, r_B, r_C обозначены радиус-векторы точек P, A, B, C соответственно.

Числа a, b, c называются барицентрическими координатами точки P относительно треугольника \Delta ABC.

Следствие 6.5. Имеют место формулы

|a|=\frac{S_{PBC}}{S_{ABC}},\\
|b|=\frac{S_{APC}}{S_{ABC}},\\
|c|=\frac{S_{ABP}}{S_{ABC}}

т. е. коэффициенты a, b, c по модулю равны отношению площади треугольника \Delta ABC, в котором соответствующая вершина заменена на P, к площади исходного треугольника \Delta ABC.

Следствие 6.6. Все три барицентрические координаты точки положительны тогда и только тогда, когда точка принадлежит внутренности треугольника \Delta ABC. Все три барицентрические координаты точки неотрицательны тогда и только тогда, когда точка принадлежит треугольнику \Delta ABC.

Билинейная треугольная поверхность. Пусть даны три точки P_1, P_2, P_3 в R^3. В качестве области параметров возьмем треугольник \Delta ABC \in R^2. Точка параметрического пространства описывается координатами 0 \le a, b, c \le 1, a+b+c = 1. Радиус-вектор треугольной поверхности с вершинами в точках P_1, P_2, P_3 задается формулой r (a, b, c) = ar_1 + br_2 + cr_3, где r_i -радиус-вектор точки P_i.

Треугольная поверхность на трех кривых. Пусть даны три попарно пересекающиеся кривые r = r_1(u), r = r_2(v), r = r_3(w ), 0 \le u,v,w \le 1, пересекающиеся в точках P_1 = r_2(0) = r_3(1), P_2 = r_1(1) = r_3(0), P_3 = r_1(0) = r_2(1) . Определим треугольную поверхность формулой

r(a, b, c) = a (r_3(1 - b) + r_2(c) - Р_1) + b (r_1(1 - c) + r_3(a) - P_2 ) + c (r_2(1-a) + r_1(b)-P_3 ), ( 6.28)

где 0 \le a, b, c \le 1, a + b + c = 1. Легко проверить, что при c = 0 формула (6.28) описывает кривую r_3(a) (0 \le a \le 1) , при a = 0 - кривую r_1(b) (0 \le b \le 1) , при b = 0 - кривую r_2(c) (0 \le c \le 1) . Например, если a = 0, то c = 1 - b и, согласно (6.28), имеем

r(0, b,1 - b) = b (r_1(b) + r_3(0) - P_2 ) + (1 - b) (r_2(1) + r_1(b) - P_3 ) =\\
= b (r_1(b) + P_2 -P_2 ) + (1 - b) ( P_3 + r_1(b) -P_3) = r_1(b).

Пример 6.3.5. Поверхность, соединяющая три поверхности по кривым на их границах. При изменении поверхностей, имеющих вид "треугольника", построенная поверхность не изменяется:


In[23]: =
        DynamicModule[{pe200, pe002, pel0l, te, tee, pe020, pell0, pe0ll, r2 , rf2 , 
             rf1, u, v, w, s, t, рb020, рb002, pb0ll, tb, tbb, pb200, pbl0l, pbll0, rl, 
             pj200, pj020, pjll0, tj , tjj, pj002, pjl0l, pj0ll, гЗ, rf3, flperem, f2perem, 
             f3perem, rfel}, 
          pe200 = {0, 10, 0} ; pe002 = {10, 0, 0} ; pel01 = {10, 10, 0}; pb020 = {0, 0, 20}; 
          pb002 = {10, 0, 0} ; pb0ll = {10, 0, 20} ; pj200 = {0, 10, 0}; pj020 = {0, 0, 20}; 
          pjll0 = {0, 10, 20} ; 
         pe020[te_] := If [te <= 0.5, {8,8,10}+2 tee ({20, 20, 0}-{8, 8, 10}) /. tee -> te,
             {20, 20, 0} + 2 {tee- 0.5) ({8, 8, -10} - {20, 20, 0}) / . tee -> te] ; 
          pell0[te_] := If [te <= 0.5, {4, 9, 5}+2 tee ({10, 15, 0} - {4, 9, 5}) /. tee -> te,
             {10, 15, 0} + 2 {tee- 0.5) ({4, 9, -5} - {10, 15, 0}) /. tee -> te] ; 
         pe011[te_] :=If[te <= 0.5, {9, 4, 5} + 2 tee ({15, 10, 0} - {9, 4, 5}) /. tee -> te,
             {15, 10, 0} + 2 (tee- 0.5) ({9, 4, -5} - {15, 10, 0}) /. tee -> te] ; 
         r2 [ te_] : = pe200 u u + pe020 [ te] v v + pe002 w w + 2 pel0l u w + 2 pel 10 [ te] u v +
             2 pe011[te] vw; 
        rf2[ te_, s_,   t_] := r2 [te] /.w ->l-u-v/. {u -> t- s t, v-> s t} ; 
        f2perem = ParametricPlot3D[Evaluate[r2 [te] /. w -> l-u-v/. v->0], {u, 0, 1},
           Mesh-> 18, PlotStyle -> {Red, AbsoluteThickness [2] } ] ; 
        pb020 = {0, 0, 20} ; pb002 = {10, 0, 0} ; pb0ll = {10, 0, 20}; 
        pb200 [ tb_] :=If[tb<=0.5, {8, 6, 16}+2 tbb ({20, 0, 40}-{8, 6, 16}) /. tbb -> tb,
            {20, 0, 40} + 2 (tbb- 0.5) ({8, -6, 16} - {20, 0, 40}) /. tbb -> tb]  ; 
         pbl01[tb_] := If [tb<=  0.5, {9,3, 8} + 2 tbb ({15, 0, 20} - {9, 3, 8}) /. tbb -> tb,
             {15, 0, 20} + 2 (tbb- 0.5) ({9, -3, 8} - {15, 0, 20}) / .  tbb -> tb] ; 
         pbll0[tb_] := If [tb <= 0.5, {4, 3, 18}+2 tbb ({10, 0, 30}-{4, 3, 18}) /. tbb -> tb,
              {10, 0, 30} + 2 (tbb- 0.5) ({4, -3, 18} - {10, 0, 30}) / . tbb -> tb] ; 
         rl [ tb_]   : = pb200 [ tb] u u + pb020 v v + pb002 w w + 2 pbl0l [ tb] uw + 2 pbll0 [ tb] u v +
             2 pb0ll vw; 
        rfl [ tb_, s_, t_] := rl [tb]  /.w->l-u-v/. {u -> t- s t,  v-> s t} ; 
        flperem = ParametricPlot3D [Evaluate [rl [tb] /. w -> l - u - v / . u -> 0] , {v, 0, 1},
             Mesh -> 18, PlotStyle -> {Red, AbsoluteThickness[2]}]; 
       pj200 = {0, 10, 0} ; pj020 = {0, 0, 20} ; pjll0 = {0 , 10, 20}; 
       pj002[tj_] := If [tj<=  0.5, {6, 8, 16} + 2 tj j ({0, 20, 40} - {6, 8, 16}) /. tj j -> tj,
             {0, 20, 40} + 2 (tj j - 0.5) ({-6, 8, 16} - {0, 20, 40}) /. tj j -> tj] ; 
        pjl01[tj_] := If {tj <= 0,5, {5, 9, 3} + 2 tjj ({0, 15, 20}-{5, 9, 8}) /. tj j -> tj,
              {0, 15, 20} + 2 (tjj - 0.5) ({-5, 9, 8} - {0, 15, 20}) / . tj j -> tj] ; 
        pj0ll [tj_] := If [tj <= 0. 5, {5, 4, 18} + 2 tjj ({0, 10, 30}-{5, 4, 18}) /. tjj -> tj,
              {0, 10, 30} + 2 (tjj - 0.5) ({-5, 4, 18} - {0, 10, 30}) /. tj j -> tj] ; 
          r3[ tj_] : = pj200uu+pj020vv + pj002[fcj] v w + 2 pjl0l[tj] u w + 2 pjll0 u v +
              2 pj0ll [tj] vw; 
        rf3[tj_, s_, t_] := r3[tj] /.w->l-u-v/. {u -> t- s t,  v-> s t} ; 
       f3perem = ParametricPlot3D [Evaluate [r3 [tj ] /. w -> 0 / . v->l-u], {u, 0, 1},
           Mesh ->18, PlotStyle -> {Red, AbsoluteThickness[2]}]; 
        rfel[tb_, te_, tj_, u_,  v_]   : = 
         и (rf3[tj, v,  1] + rf2[te, 0, u + v] - rf2[te, 0, 1] ) + 
           v  (rfl [tb, 1, u+ v] + rf3[tj, 1 - u, 1] - rfl[ tb, 1, 1] ) +
            (1-u- v) (rf2[te, 0, u] + rfl[ tb, 1, v] - rf 1 [ tb, 1, 0] ) ; (*три кривые rfl[tb,l,t] , 
        rf2[te,0,l-t] и rЈ3[tj,l-t,l] , t Ha [0,1]*) 
       Manipulate[ 
           Show[{ParametricPlot3D[Evaluate[rfl[tb, s, t] ] , {s, 0, 1}, {t, 0, 1}, 
                 Mesh -> None, PlotRange -> All, PlotStyle -> {Opacity [0 . 8] , Green}], 
             ParametricPlot3D[Evaluate[rf2 [te, s, t] ] , {s, 0, 1}, {t, 0, 1}, Mesh-> None,
                 PlotRange-> All, PlotStyle -> {Opacity [0 . 9] , Yellow}], 
             ParametricPlot3D[Evaluate[rf3[tj , s, t] ] , {s, 0, 1}, {t, 0, 1}, Mesh-> None,
                 PlotRange -> All, PlotStyle-> {Opacity [0 . 8] , Blue}], 
             ParametricPlot3D[Evaluate[rfel [tb, te, t j , s, t] ] , {s, 0, 1}, {t, 0, 1 - s} ,
                Mesh -> {13, 18}, PlotRange-> All] , 
              f1perem, f2perem, fЗрегеm} , Viewpoint-> {-0 . 7 , 0.4, 1-3}, ImageSize ->  {300 , 200}, 
           Boxed -> False, Axes -> None, PlotRange -> {{-6. , 20.}, {-6., 20.}, {-10., 40.}}, 
           Spherical Region -> True, ViewAngle-> 0 . 7 ], 
        {{tb, 0.4, "Зеленый ""треугольник '"}, 0., 1., Appearance->'Labeled" } , 
        { {te, 0.4, " Желтый ' ' треугольник '" } , 0 . , 1. , Appearance -> " Labeled" } , 
         { {t j , 0.4, " Синий " " треугольник' ' " } , 0 . , 1. , Appearance -> " Labeled" } , 
       SaveDefinitions -> True] ]
Олег Корсак
Олег Корсак
Латвия, Рига
Александр Дронов
Александр Дронов
Россия, Воронеж, Воронежский государственный технический университет, 1995