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

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

Поверхности, затягивающие заданные граничные контуры

В ряде приложений (например, в проектировании корпусов и крыльев самолетов и кораблей) требуется строить гладкие поверхности, затягивающие заданные остовы из кривых - криволинейные сетки, криволинейные направляющие (например, несущий остов корпуса корабля), различные граничные контуры. Во многих случаях важное значение имеет также и вычислительная сторона вопроса - сложность вычисления радиус-вектора поверхности и ее дифференциально-геометрических характеристик не должна быть слишком высокой.

В компьютерной геометрии существует несколько различных подходов к решению подобных задач. Ниже будет рассмотрены некоторые из этих подходов, ставшие классическими.

Линейчатые поверхности

Линейчатая поверхность - геометрическое место точек отрезков прямых, соединяющих соответствующие друг другу точки двух заданных кривых. Пусть \rho_1(t), t_0 \le t \le t_1, и \rho_2(w), w_0 \le w \le w_1,- две заданные кривые. Тогда определяемая ими линейчатая поверхность имеет вид

r(u,v) = (1-v)\rho_1(t) + v \rho_2(w),

где t = t_0(1-u)+t_1u, w = w_0(1 - u) + w_1u, 0 \le u, v \le  1.

Если обе кривые \rho_1 и \rho_2 замкнуты, то линейчатая поверхность замкнута по u. По параметру v линейчатая поверхность всегда незамкнута.

Если обе кривые \rho_1 и \rho_2 - отрезки прямых, то линейчатая поверхность называется билинейной и определяется только своими четырьмя угловыми точками p_1, p_2, p_3, p_4:

r(u, v) = (1 - v) ( (1 - u)p_1 + up_2 ) + v ( (1 - u)p_3 + u p_4 ) =\\
= (1 - u)(1 - v)p_1 + u(1 - v)p_2 + (1 - u)vp_3 + uvp_4,\\
0 \le u, v \le 1.

Секториальные поверхности

Секториальная поверхность - частный случай линейчатой поверхности, когда одна из кривых \rho_1 и \rho_2 вырождается в точку:

r(u,v) = (1-v) \rho (u)+vp,

где \rho ( u) - кривая, p - точка, u_1 \le u \le u_2, 0 \le v \le 1.

Секториальная билинейная поверхность называется треугольной поверхностью.

Поверхности Кунса

Линейные поверхности Кунса. Вычтем и добавим к уравнению линейчатой поверхности уравнение билинейной поверхности, построенной по четырем угловым точкам (см. выше). Уравнение линейчатой поверхности примет вид

r(u,v) = (1-v)\rho_1(u)+v \rho_2(u) = (1-v) \rho_1(u)+v \rho_2(u)+(1-u) ( (1-v)p_1+vp_3 ) +\\
 + u ( (1 - v)p_2 + vp_4 ) - (1 - u)(1 - v)p_1 - u(1 - v)p_2 - (1 - u)vp_3 - uvp_4 =\\
 = (1 - v) \rho_1(u) + v \rho_2(u) + (1 - u) \rho_3(v) + u \rho_4(v) - (1 - u)(1 - v)p_1-\\
- u(1 - v)p_2 - (1 - u)vp_3 - uvp_4,\\
0 \le u, v \le 1, ( 6.13)

где \rho_1 (u) и \rho_2 (u) - кривые, по которым строится данная линейчатая поверхность, причем считается, что на них обеих задан один и тот же параметр 0\leu\le1,и

\rho_3(v) = (1-v)p_1+vp_3,\\
\rho_4(v) = (1 - v)p_2 + vp_4 ( 6.14)

- отрезки прямых.

Подставим теперь в уравнение (6.13) вместо отрезков прямых (6.14) уравнения двух произвольных кривых \rho_3(v) и \rho_4(v) , соединяющих соответственно пары точек (p_1, p_3) и (p_2, p_4) . Тогда новая поверхность, задаваемая уравнением (6.13), будет определяться четырьмя кривыми \rho_1, \rho_2, \rho_3, \rho_4, образующими криволинейный четырехугольник, натянутый на угловые точки p_1, p_2, p_3, p_4. При этом все четыре кривые \rho_1, \rho_2, \rho_3, \rho_4 войдут в уравнение (6.13) симметрично. Получится линейная поверхность Кунса.

Определение 6.3.1. Пусть заданы четыре кривые, образующие криволинейный четырехугольник с углами в точках p_1, p_2, p_3, p_4:

\begin{martix}
\gamma_a=r(u,0),&0 \le u \le 1,&r(0,0)=p_1,&r(1,0)=p_2,\\
\gamma_b=r(0,v) &0 \le v \le 1, & r(0,0)=p_1 & r(1,0)=p_3),\\
\gamma_c(1,v) & 0 \le v 1 & r(0,0)=p_1 & r(0,1)=p_3,\\
\gamma_d=r(u,1),&0 \le u \le 1, & r(0,1)=p_3, &r(1,1)=p_4
\end{matrix}

Обозначим

\alpha_0(t) = 1-t,\\
\alpha_1(t)=t.

Функции \alpha_0(t), \alpha_1(t) будем называть функциями смещения линейной поверхности Кунса. Сама линейная поверхность Кунса определяется следующей формулой:

r(u, v) = \alpha_0(v)r(u, 0) + \alpha_0(u)r(0, v) + \alpha_1(v)r(u, 1)+\\
+ \alpha_1(u)r(1,v) -\alpha_0(u) \alpha_0(v)r(0,0) -\alpha_1(u)\alpha_0(v)r(1,0)-\\
- \alpha_0(u)\alpha_1(v)r(0,1) -\alpha_1(u)\alpha_1(v)r(1, 1). ( 6.15)

Замечание 6.3.1. Линейная поверхность Кунса не является, вообще говоря, линейчатой поверхностью. Название "линейная" обусловлено тем, что в ее определении используются линейные функции смещения \alpha_0 и \alpha_1.

Замечание 6.3.2. Параметрическая область поверхности Кунса может иметь вид прямоугольника, не обязательно совпадающего с квадратом [0,1] \times [0,1] .

Матричный вид уравнения поверхности Кунса. Преобразуем формулу (6.15) к другому виду. Имеем в матричных обозначениях

r(u,v) = ( \alpha_0(u)   \alpha_1(u)  ) \begin{pmatrix}
r(0,v)\\
r(1,v)
\end{pmatrix} + ( \alpha_0(v)   \alpha_1(v)  ) \begin{pmatrix}
r(u,0)\\
r(u,1)
\end{pmatrix} -\\
-( \alpha_0(u) \alpha_1(u)) \begin{pmatrix}
r(0,0) & r(0,1)
r(1,0) & r(1,1)
\end{pmatrix} \begin {pmatrix}
\alpha_0(v)\\
\alpha_1(v)
\end{pmatrix} =\\
= \sum_{i=0}^1 \alpha_i(u)r(i, v) + \sum_{j=0}^1 \alpha_j(v)r(u,j) - \sum_{i=0}^1 \sum_{j-0}^1 \alpha_i(u)\alpha_j(v)r(i, j).

Пример 6.3.1. Зададим с помощью поверхности Кунса область D плоскости, ограниченную эллипсом \frac{x^2}{a^2}+\frac{y^2}{b^2}=1 или \begin{cases}
x=a\ cos\ \varphi\\
y=b\ cos\ \varphi,
\end{cases} где 0 \le \varphi < 2 \pi, с полуосями a > 0, b > 0. Представим границу области D в виде четырех кривых - дуг эллипса, стыкующихся в точках p_1, p_2, p_3, p_4. Соответствующая линейная поверхность Кунса имеет вид

r(u,v)=a(cos\ u+ cos\ v-1 + \frac{2u(1-cos\ v - sin\ v)}{\pi}+\frac{2v(1-cos\ u - sin\ u)}{\pi})e_i+\\
+b(sin\ u - sin\ v - \frac{2u(1-cos\ v-sin\ v)}{\pi}+\frac{2v(1-cos\ u - sin\ u)}{\pi})e_2,\\
0 \le u, v \le \frac{\pi}{2}

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

Пример 6.3.2. Поверхность Кунса, построенная по кривым, лежащим на заданных поверхностях. Кривые раскрашены красным, зеленым, желтым и оранжевым.

In[21]: =
    
       DynamicModule[{rl = 30 . , r2 = 30. , r3 = 30 . , d = 50 . , u , v, ml, m2 , m3, m4 , fl,
             f2, f3, f4, rfel,  α,  MV, MU, laml, lam2, rfk}, rl = 30. ; r2 = 30. ; r3 = 30. ; 
        d = 50. ; laml = 2. ; lam2 = 1. ;
        f1 [ml_] : = {rl - rl *Cos[u * Pi] , laml * d* v / 2, m1*  (Sin [u * Pi] *Sin[v*Pi])^4} ; 
        f2 [m2_ ] := {r2 - r2 *Cos[u*Pi] , d- lam2 *d/ 2 + lam2 *d*v/2, m2* (Sin [u* Pi])^2}; 
       f3[m3_ ] := {0.8 * r3*u, d*v, m1*  (Sin[v* 3* Pi] )^2} :
       f4 [m4_] :={1.6*r1+0.4*rl*u+(v^4-2*v^3+v^2)*100*m4*u, d*v, 0} ; 
        Manipulate[ 
           Show[{ParametricPlot3D[Evaluate@fl [ml] , {u, 0, 1}, {v, -1, 0}, Mesh -> {24, 24}, 
              PlotRange -> All] , 
            ParametricPlot3D[Evaluate@{fl [ml] /. v -> 0}, {u, 0, 1}, Mesh -> {24, 24), 
              PlotRange -> All, PlotStyle ->  {Red} ] ,
                   ParametricPlot3D[Evaluate@f2[m2] , {u , 0, 1}, {v, 1, 2} , Mesh -> {24, 2}, 
                PlotRange -> All] , 
             ParametricPlot3D[Evaluate@{f2 [m2] /. v -> l}, {u, 0, 1}, Mesh -> {24, 24},
                PlotRange -> All, PlotStyle -> {Green} ] , 
             ParametricPlot3D[Evaiuate@f3[m3] , {u, -1, 0}, {v, 0, 1}, Mesh -> {2, 24},
                PlotRange -> All] , 
             ParametricPlot3D[Evaluate@{f3 [m3] /.u -> 0), {v, 0, 1}, Mesh -> {24, 24},
                PlotRange -> All, PlotStyle -> {Yellow} ] , 
             ParametricPlot3D[Evaluate@f4 [m4] , {u, 1, 2}, {v, 0, 1}, Mesh -> {2, 24},
                PlotRange -> All] , 
             ParametricPlot3D[Evaluate@{f4 [m4] /.u -> l}, {v, 0, 1}, Mesh -> {24, 24},
                PlotRange -> All, PlotStyle -> {Orange} ] , 
             ParametricPlot3D [Evaluate@rfel [ml, m2, m3, m4], {u, 0, 1}, {v, 0, 1}, 
                Mesh -> {24 , 24} , PlotRange -> All] } , 
             ImageSize -> {500 , 380}, Axes -> None, Boxed -> False, 
             PlotRange -> {{-30, 135}, {-50, 100}, {-30, 30}} 
           ], {{ml, 10, " ' ' Ухабистая' ' поверхность"}, -15., 15., Appearance -> "Labeled"}, 
          {{m2, 20, "Цилиндрическая поверхность"}, -30, 30, Appearance -> "Labeled"}, 
          {{m3, 10, "Волновая поверхность"}, -10, 10, Appearance -> "Labeled"}, 
          {{m4, 1, "Плоская поверхность"}, -5, 5, Appearance -> "Labeled"}, 
           ControlPlacement -> Top, 
           Initialization : -> (
                   rl = 30 . ; r2 = 30. ; r3 = 30. ; d = 50. ; laml = 2. , lam2 = 1. ;
                fl [ml_] : = {rl - rl *Cos [u * Pi] , laml *d*v/2, m1*  (Sin[u * Pi] * Sin[v* Pi])^4} ;
               f2[m2_] := {r2 - r2*Cos[u*Pi] , d- lam2*d/ 2 + lam2 *d*v/2, m2* (Sin[u*Pi] )^2} ;
               f3[m3_] := {0.8 * r3*u, d*v, m3*  (Sin[v* 3* Pi])^2} ;
               f4 [m4_] :={1.6*rl+0.4*rl*u+(v^4-2*v^3+v^2)*100*m4*u, d*v, 0} ;
              \alpha [t_]   := t; MV[v_] : = {1 - \alpha [v] , \alpha [v] } ; MU[u_]: = {1 - \alpha  [u] , \alpha [u] } ;
               (* наши функции а *)
                Table [rfk [ml, m2, m3, m4] [i] , {i, 3}] ;
               Do[rfk[ml_, m2_, тЗ_, т4_] [i] =
                   MU[u].{f3[m3][[i]] /. u ->0, f4[m4][[i]] /. u ->l} + 
                      MV[v] . {fl [ml] [ [i] ] /. v->0, f2[m2][[i]] /. V->1} -
                        MU[u] . {{f3[m3] [[i]] /. {u ->0, v-> 0} , f3[m3] [[i]] /. {u -> 0, v->l}},
                               {f4 [m4] [ [i] ] /. {u -> 1 , v-> 0} , f4 [m4] [ [i] ] /. {u-> 1, v -> 1} } } .MV[v] // 
                          Together; 
              , {i, 3}] ; rfel[ml_, m2_, тЗ_, m4_]  = 
              {rfk [ml, m2, m3, m4] [1] , rfk [ml, m2, m3, m4] [2] , rfk [ml, m2, m3, m4] [3] };) ]]

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

Определение 6.3.2. Обобщенной поверхностью Кунса n-го порядка называется поверхность

r(u,v)=\sum_{i=0}^1 \sum_{k=0}^n \alpha_{k,i}(u)r_u^{(k)}(I,v)+\sum_{j=0}^1 \sum_{k=0}^n \alpha_{k,j}(v)r_v^{(k)}(u,j)-\\
-\sum_{i=0}^1 \sum_{j=0}^1 \sum_{k=0}^n \sum_{l=0}^n \alpha_{k,i}(u) \alpha_{l,j}(v)r_{uv}^{(k,l)}(I,j),\\
0 \le u,v \le 1 ( 6.16)

задаваемая четырьмя граничными кривыми r(u,0), r(0,v), r(1,v), r(u, 1) , стыкующимися в точках p_1 = r(0, 0), p_2 = r(1,0), p_3 = r(0,1) и p_4 = r(1,1) , а также чистыми частными производными в трансверсальном направлении на граничных кривых до n -го порядка включительно и смешанными частными производными в угловых точках p_1, p_2, p_3, p_4 до 2n -го порядка включительно:

\begin{matrix}
r_u^{(k)}(I,v)=\frac{\partial^k r(u,v)}{ \partial u^k} \left |_{u=i}, & i=0,1, & k=1, \dots, n\\
r_v^{(k)}(u,j)=\frac{\partial^kr(u,v)}{ \partial v^k} \left |_{v=j}, & j=0,1, & k=1, \dots, n\\
r_{uv}^{(k,l)}=\frac{\partial^{k+l}(u,v)}{ \partial u^k \partial v^l} \left|_{u=i, v=j} & i,j=0,1, & k,l=1, \dots, n
\end{matrix}
( 6.17)

а также обобщенными функциями смещения \alpha_{k ,i}(t) , где 0 \le k \le n, i = 0, 1, в качестве которых могут быть взяты произвольные гладкие функции, удовлетворяющие соотношениям

\frac{d^m \alpha_{k,i}(t)}{dt^m} \left|_{t=j}=\delta_i^j \delta_k^m=\begin{cases}
1, \mbox{если} i=j, k=m,\\
0, \mbox{иначе}.
\end{cases} ( 6.18)

Здесь 0\le k, m \le n.

Задача 6.3.1. Проверить, что поверхность (6.16), определенная с помощью (6.17) и (6.18), имеет заданные в (6.17) производные на границе.

Замечание 6.3.3. В качестве обобщенных функций смещения всегда можно выбрать многочлены.

Пример 6.3.3. Определим функции смещения формулами

\alpha_0(t) = 1-3t^2 + 2t^3, \alpha_1(t) = 3t^2-2t^3,\\
\beta_0(t)=t-2t^2 +t^3 ,       \beta_1(t) = -t^2 +t^3 ( 6.19)

(здесь для простоты использованы обозначения \alpha_{0,0}(t) = \alpha_0(t), \alpha_{0,1}(t) = \alpha_1(t), \alpha_{1,0}(t) = \beta_0(t), \alpha_{1, 1}(t) = \beta_ 1(t)) . Пусть заданы , четыре кривые r(u, i), r(i,v) , где i = 0, 1, стыкующиеся в точках r(0,0), r(0,1), r(1,0), r(1,1) . Пусть заданы первые производные на границе в трансверсальном направлении: r_u(i, v), r_v(u, i), i = 0, 1, и вторые смешанные производные в угловых точках: r_{uv}(i,j),i,j = 0,1.

Кубическая поверхность Кунса определяется формулой (в матричных обозначениях)

r(u,v)=(\alpha_0(u) \alpha_1(u) \beta_0(u) \baeta_1(u)) \left( \begin{matrix}
r(0,v)\\
r(1,v)\\
r_u(0,v)\\
r_u(1,v)
\end{matrix} \right)+\\
+(\alpha_0(v) \alpha_1(v) \beta_0(v) \beta_1(v) ) \left( \begin{matrix}
r(u,0)\\
r(u,1)\\
r_v(u,0)\\
r_v(u,1)
\end{matrix} \right)-\\
 - \left( \begin{matrix}
\alpha_0(u)\\
\alpha_1(u)\\
\beta_0(u)\\
\beta_1(u)
\end{matrix} \right )^{\top} \begin{pmatrix}
r(0,0) & r(0,1) & r_v(0,0) & r_v(0,1)\\
r(1,0) & r(1,1) & r_v(1,0) & r_v(1,1)\\
r_u(0,0) & r_u(0,1) & r_{uv}(0,0) & r_{uv}(0,1)\\
r_u(1,0) & r_u(1,1) & r_{uv}(1,0) & r_{uv}(1,1)
\end{pmatrix}  \begin{pmatrix}
\alpha_0(v)\\
\alpha_1(v)\\
\beta_0(v)\\
\beta_1(v)
\end{pmatrix} ,\\
0 \le u,v \le 1

Задача 6.3.2. Написать на пакете Mathematica программу построения кубической поверхности Кунса.