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

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

Поверхности, построенные по каркасу из кривых

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

Поверхности Эрмита. Напомним, что сплайном Эрмита называется кусочно-кубическая кривая, проходящая через заданные точки p_0, \dots , p n \in R^N и имеющая в этих точках заданные производные q_0, \dots , q_n \in R^N. Если производные q_i не заданы, то в точках p_1,  \dots , p_{ n-1} их можно определить из некоторых "естественных" соображений. Одним из примеров такого рода является псевдоупругий сплайн Эрмита. Еще один способ - положить по определению

q_i=\frac{p_{i+1}-p_i}{t_{i+1}-t_i}

(есть и другие способы).

Задание производных на концах p_0 и p_n иногда заменяют на условие обращения в ноль третьей производной на концах кривой. Это условие равносильно следующим формулам:

\begin{cases}
q_0=2(p_1-p_o)-q_1,\\
q_n=2(p_n-p_{n-1})-q_{n-1}
\end{cases}

Напомним, что вторые производные в опорных точках сплайна Эрмита (где происходит стык кубических кривых) претерпевают разрыв, т. е. сплайны Эрмита принадлежат классу C^1. Аналогично сплайнам Эрмита строятся поверхности Эрмита.

Пусть имеется семейство кривых

\begin{cases}
r=r_0(u)=r(u,0),\\
..................\\
r=r_i(u)=r(u,i),\\
..................\\
r=r_n(u)=r(u,n)
\end{cases}
( 6.20)

Без ограничения общности будем считать, что параметр u для всех кривых пробегает один и тот же отрезок: u_0 \le u \le u_1. Тогда поверхность Эрмита, затягивающая остов кривых r(u,i), 0 \le i \le n, определяется формулой, аналогичной формуле для сплайна Эрмита:

r(u, v) = r(u, j) \alpha_0(w) + r(u, j + 1) \alpha_ 1(w)+\\
+ r_v(u,j) \beta_0(w)+r_v(u,j + 1) \beta_1(w),

если j \le v \le j + 1. Здесь w = v - j - местный параметр на данном участке поверхности ( 0 \le w \le 1 ), r_v(u,j) и r_v(u,j + 1) - производные в трансверсальном направлении на заданном остове кривых (6.20), \alpha_0(w) = 1-3w^2 + 2w^3, \alpha_1(w) = 3w^2-2w^3, \beta_0( w ) = w-2w^2+w^3, \beta_1(w) = -w^2+w^3. Параметрическая область поверхности Эрмита имеет вид

\begin{cases}
u_0 \le u \le u_1,\\
0 \le v \le n
\end{cases}

Если трансверсальные производные r_v ( u, i) на линиях остова не заданы, то их, аналогично случаю сплайна Эрмита, можно определить, например, так:

\begin{cases}
r_v(u,j)=\frac{r(u,j+1)-r(u,j-1)}{2}, 1 \le j \le n-1,\\
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).
\end{cases}

При таком определении третьи производные на кривых r_0 и r_n в трансверсальном направлении обратятся в ноль:

\frac{\partial^3r(u,v)}{ \partial v^3} \left|_{v=0}=\frac{\partial^3r(u,v)}{ \partial v^3} \left|_{v=n}=0

Сами исходные кривые r_0, \dots  ,r_n, образующие остов поверхности Эрмита, могут быть построены как кривые Безье или B -кривые. При этом получаются поверхности класса C^1, имеющие на двух участках границы управляемые производные по трансверсальному направлению (а именно, на участках r(u,0) и r(u,n) ). На участках границы r(u_0,v) и r(u_1,v) производные, вообще говоря, управляются лишь приблизительно - с помощью выбора кривых остова r_i ( u) .

Применение поверхностей Эрмита: поверхность перехода. Примером применения поверхностей Эрмита может служить задача объединения двух поверхностей в одну общую поверхность путем соединения их краев с помощью поверхности перехода.

Пусть даны две поверхности M и N, которые надо сопрячь, соединив поверхностью перехода край r = r_M(t,u_1^M) первой поверхности и край r = r_N(t,u_0^N) второй поверхности. Будем считать, что оба сопрягаемых края отнесены к одному и тому же параметру t, изменяющемуся в пределах t_0 \le t \le t_1. Второй параметр на поверхностях M и N обозначим (в обоих случаях) через u. Пусть параметрические пространства поверхностей имеют вид

\begin{cases}
t_0 \le t \le t_1,\\
u_0^M \le u \le u_1^M
\end{cases}

для поверхности M : r = r_M ( t, u ) и

\begin{cases}
t_0 \le t \le t_1,\\
u_0^N \le u \le u_1^N
\end{cases}

для поверхности N : r = r_N(t, u) . Без ограничения общности будем считать, что u_1^M \le u_0^N. Тогда поверхность перехода от M к N может быть описана формулой поверхности Эрмита:

r(t,w)=r_M(t, u_1^M)(1-3w^2+2w^3)+r_N(t, u_0^N)(3w^2-2w^3)+\\
+\frac{\partial}{\partial w} \left|_{u=u_1^M} r_m(t,u)(w-2w^2+w^3)+\frac{\partial}{\partial w}\left|_{u=u_0^N} r_N(t,u)(-w^2+w^3),

где w =\frac{u-u_1^M}{u_0^N-u_1^M} - местный параметр по направлению u, t_0 \le t \le t_1, 0 \le w \le 1. Данная поверхность Эрмита гладко сопрягает поверхности M и N по заданным краям. Класс гладкости сопряжения - C^1.

Пример 6.3.4. Приклейка ручки с помощью поверхности перехода:

In[22] := Style [Module [{v, rl, r2, s1, s2 , drl, dr2 , dsl, ds2 , r, s},
                       r1[u_, v_]   : = {-3 + (7 + 1.5 Cos [2 π u]) Sin [2 π v + π] , 1.5 Sin [2 π u] ,
                        {7 + 1.5 Cos [2 π u]) Cos [2 π v + π] } ; (*тор, u и v в пределах [0,1]*) 
                     r2 [u_, y_] := {5 Cos [2 π u] * Sin [π (v - 1) ] , 5 Sin [2 π] * Sin [π (v - 1) ] ,
                       5 Cos [π {v - 1) ] } ; {*сфера, u в пределах [0,1], v в пределах [1,2]*) 
                   drl[t_] :=D[rl[t, v], v] * (7 / 6 - (1/2-1/10)) /.v -> l/2-l/10; 
              dr2[t_] := D[r2[t, v] , v] * (7 / 6 - (1/2-1/10)) / . v  -> 7 / 6; 
                   r[t_, w_]   :=rl[fc, 1/2-1/10] (l- 3 w2 + 2 w3) + r2[t, 7/6] (з w2 - 2 w3) +
                      drl[t] (w- 2 w2  + w3) + dr2[t] (-w2 + w3 ) ; 
                      sl[u_, v_] :=r2[u, v + 2] ; (* u в пределах [0,1], v в пределах [-1,0]*) 
                      s2[u_, v_] :=rl[u, v] ;
                        dsl[t_] := D[sl[t, v] , v] * (1/10 + 1 / 6) /. v -> -1/ 6; 
                        ds2[t_] :=D[s2[t, v], v] * (1 / 10 + 1 / 6) / . v -> 1 / 10; 
                          s[t_, w_] :=sl[t, -1/6] (l- 3 w2 + 2 w3) + s2[t, 1/10] (з w2 - 2 w3) +
                             dsl[t] (w- 2 w2 + w3) + ds2[fc] (-w2 + w3 ) ; 
                         Manipulate[Show[{
                              PararaetricPlot3D[rl[u, v] , {u, 0, 1} , {v, 1/10, 1 /2 - 1 / 10} ,
                              PlotStyle -> FaceForm[Orange, Blue]], 
                           PararaetricPlot3D[r2[u, v] , {u, 0,1}, {v, 1 + 1/6, 1+5/6},
                              PlotStyle -> FaceForm[Orange, Blue]], 
                           ParametricPlot3D[r [t, w] , {t, 0, 1}, {w, 0, wl},
                              PlotStyle -> FaceForm [Orange, Blue]], 
                          ParametricPlot3D [s [t, w] , {t, 0, 1}, {w, 0,w2}, 
                             PlotStyle -> FaceForm[Orange, Blue]] 
                      }, PlotRange -> {{-12, 10}, {-10, 10}, {-10, 10}}, 
                       Axes -> False, Boxed -> False 
                    ] , {{wl, 1} , 0.001, 1}, {{w2, 0.001}, 0.001, 1}, TrackedSymbols -> {wl, w2},                         
                     SaveDefinitions -> True, ControlPlacement -> Lef t] 1 , Magnification -> 2]