Украина |
Кривые и поверхности в компьютерной геометрии, II
Поверхности, затягивающие заданные граничные контуры
В ряде приложений (например, в проектировании корпусов и крыльев самолетов и кораблей) требуется строить гладкие поверхности, затягивающие заданные остовы из кривых - криволинейные сетки, криволинейные направляющие (например, несущий остов корпуса корабля), различные граничные контуры. Во многих случаях важное значение имеет также и вычислительная сторона вопроса - сложность вычисления радиус-вектора поверхности и ее дифференциально-геометрических характеристик не должна быть слишком высокой.
В компьютерной геометрии существует несколько различных подходов к решению подобных задач. Ниже будет рассмотрены некоторые из этих подходов, ставшие классическими.
Линейчатые поверхности
Линейчатая поверхность - геометрическое место точек отрезков прямых, соединяющих соответствующие друг другу точки двух заданных кривых. Пусть и
- две заданные кривые. Тогда определяемая ими линейчатая поверхность имеет вид
![r(u,v) = (1-v)\rho_1(t) + v \rho_2(w),](/sites/default/files/tex_cache/6ab153897f98430947af83951cc3b54f.png)
где
Если обе кривые и
замкнуты, то линейчатая поверхность замкнута по u. По параметру v линейчатая поверхность всегда незамкнута.
Если обе кривые и
- отрезки прямых, то линейчатая поверхность называется билинейной и определяется только своими четырьмя угловыми точками
:
![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.](/sites/default/files/tex_cache/bce5edd23f2855ae1d1af8c4756f5c21.png)
Секториальные поверхности
Секториальная поверхность - частный случай линейчатой поверхности, когда одна из кривых и
вырождается в точку:
![r(u,v) = (1-v) \rho (u)+vp,](/sites/default/files/tex_cache/52f8d83bb00b3bd001357a4ce0fff18c.png)
где - кривая, p - точка,
Секториальная билинейная поверхность называется треугольной поверхностью.
Поверхности Кунса
Линейные поверхности Кунса. Вычтем и добавим к уравнению линейчатой поверхности уравнение билинейной поверхности, построенной по четырем угловым точкам (см. выше). Уравнение линейчатой поверхности примет вид
![]() |
( 6.13) |
где и
- кривые, по которым строится данная линейчатая поверхность, причем считается, что на них обеих задан один и тот же параметр
и
![]() |
( 6.14) |
- отрезки прямых.
Подставим теперь в уравнение (6.13) вместо отрезков прямых (6.14) уравнения двух произвольных кривых и
соединяющих соответственно пары точек
и
Тогда новая поверхность, задаваемая уравнением (6.13), будет определяться четырьмя кривыми
образующими криволинейный четырехугольник, натянутый на угловые точки
При этом все четыре кривые
войдут в уравнение (6.13) симметрично. Получится линейная поверхность Кунса.
Определение 6.3.1. Пусть заданы четыре кривые, образующие криволинейный четырехугольник с углами в точках :
![\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}](/sites/default/files/tex_cache/7a5cb0efaf061c9acd69d4003526e9e3.png)
Обозначим
![\alpha_0(t) = 1-t,\\
\alpha_1(t)=t.](/sites/default/files/tex_cache/46650eac35bf5f2f8dfd71991118dfbe.png)
Функции будем называть функциями смещения линейной поверхности Кунса. Сама линейная поверхность Кунса определяется следующей формулой:
![]() |
( 6.15) |
Замечание 6.3.1. Линейная поверхность Кунса не является, вообще говоря, линейчатой поверхностью. Название "линейная" обусловлено тем, что в ее определении используются линейные функции смещения и
Замечание 6.3.2. Параметрическая область поверхности Кунса может иметь вид прямоугольника, не обязательно совпадающего с квадратом
Матричный вид уравнения поверхности Кунса. Преобразуем формулу (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).](/sites/default/files/tex_cache/ed4c7ce8dadc1d1a8ce69993dca316dc.png)
Пример 6.3.1. Зададим с помощью поверхности Кунса область D плоскости, ограниченную эллипсом или
где
с полуосями
Представим границу области D в виде четырех кривых - дуг эллипса, стыкующихся в точках
Соответствующая линейная поверхность Кунса имеет вид
![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}](/sites/default/files/tex_cache/77c00ff7ee61571f0ee5e3fff9869e9d.png)
Преимущество задания плоских областей в виде линейных поверхностей Кунса состоит в том, что у поверхности Кунса параметрическая область -всегда прямоугольник.
Пример 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-го порядка называется поверхность
![]() |
( 6.16) |
задаваемая четырьмя граничными кривыми стыкующимися в точках
и
а также чистыми частными производными в трансверсальном направлении на граничных кривых до
-го порядка включительно и смешанными частными производными в угловых точках
до
-го порядка включительно:
![]() |
( 6.17) |
а также обобщенными функциями смещения где
в качестве которых могут быть взяты произвольные гладкие функции, удовлетворяющие соотношениям
![]() |
( 6.18) |
Здесь
Задача 6.3.1. Проверить, что поверхность (6.16), определенная с помощью (6.17) и (6.18), имеет заданные в (6.17) производные на границе.
Замечание 6.3.3. В качестве обобщенных функций смещения всегда можно выбрать многочлены.
Пример 6.3.3. Определим функции смещения формулами
![]() |
( 6.19) |
(здесь для простоты использованы обозначения Пусть заданы , четыре кривые
где
стыкующиеся в точках
Пусть заданы первые производные на границе в трансверсальном направлении:
и вторые смешанные производные в угловых точках:
Кубическая поверхность Кунса определяется формулой (в матричных обозначениях)
![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](/sites/default/files/tex_cache/647aa3b6291af6a87e37a179d25d439a.png)
Задача 6.3.2. Написать на пакете Mathematica программу построения кубической поверхности Кунса.