Украина |
Кривые и поверхности в компьютерной геометрии, II
Алгоритм вычисления радиус-вектора B-кривой
Пусть даны опорные точки и их веса
а также расширенное множество неубывающих узлов
Опишем алгоритм вычисления радиус-вектора B -кривой
![r(t)=\frac{\sum_{i=1}^n N_{i,m}(t) \omega_i p_i}{\sum_{i=1}^n N_{i,m}(t) \omega_i}.](/sites/default/files/tex_cache/ad209f9a9538a71c30c72810c5866124.png)
-
Фиксируем t. Положим
Тогда существует единственное
такое, что
где
-
Для определенного выше индекса
если
вычисляем единственное ненулевое значение ненормированного B -сплайна первого уровня (m=1):
Напомним, что
было выбрано на первом шаге, так чтобы
При этом, в силу условия
знаменатель
а в силу условия
имеем
Следовательно,
Для индекса
находящегося вне множества
значение
не вычисляется.
-
С помощью соотношений Кокса - де Бура вычисляем все отличные от нуля в точке
ненормированные сплайны
-го порядка
при
:
В частности,
( 6.6) где
Положив в (6.6)
получим
Лемма 6.5. Имеет место соотношение:
-
Вычисляем нормированные сплайны
для каждого
по формуле
(при этом
).
-
Окончательно вычисляем
по формуле
Алгоритм де Бура вычисления радиус-вектора B-кривой
Теорема 6.4. Радиус-вектор r(t) B -кривой:
![r(t)=\frac{\sum_{i=1}^nN_{i, m}(t) \omega_i p_i}{\sum_{i=1}^n N_{i, m}(t) \omega_i}=\frac{\omega r}{\omega}](/sites/default/files/tex_cache/fb5a1f92e5d7c36c97c5e12e24b32aeb.png)
может быть вычислен с помощью следующего алгоритма:
-
Для заданного
вычисляем величины
при
по рекуррентным формулам:
-
Вычисляем r(t) по формуле
Данный алгоритм иллюстрируется следующей диаграммой ( ):
![\begin{matrix}
r_{i_0-m+1}^{(0)}& r_{i_0-m+2}^{(0)}& \dots & r_{i_0-1}^{(0)}& r_{i_0}^{(0)}\\
& r_{i_0-m+2}^{(1)}& \dots & r_{i_0-1}^{(1)}&r_{i_0}^{(1)}\\
& & \ddots & \vdots & \vdots \\
& & & r_{i_0-1}^{(m-2)}& r_{i_0}^{(m-2)}\\
& & & &r_{i_0}^{(m-1)}
\end{matrix}](/sites/default/files/tex_cache/e53f1286291b7d0f09fbd76661380579.png)
Поверхности, определяемые матрицами опорных точек и весов
Поверхности Безье
Определение 6.2.1. Пусть дано (m +1) * (n+1) точек в пространстве образующих прямоугольную матрицу (сетку Безье):
![P_{mn}=\begin{pmatrix}
p_{00} &\dots &p_{0n}\\
p_{10} &\dots &p_{1n}\\
\vdots &\ddots &\vdots \\
p_{m0} &\dots &p_{mn}
\end{pmatrix}](/sites/default/files/tex_cache/366d2ad46d87ad2753f490ec256ce01e.png)
Поверхностью Безье порядка m * n, соответствующей сетке называется поверхность
![]() |
( 6.7) |
где E - оператор сдвига вперед по первому индексу, F - оператор сдвига вперед по второму индексу:
![Ep_{ij}=p_{(i+1)j},\\
Fp_{ij}=p_{i(j+1)}.](/sites/default/files/tex_cache/fddb70292260f062d047c8ce1817f82a.png)
Операторы E и F очевидно коммутируют друг с другом: Поэтому
т. е. формула (6.7) непротиворечива.
Определение 6.2.2. Рациональная поверхность Безье, построенная по точкам с весами
определяется следующим образом:
![]() |
( 6.8) |
Формула (6.8) означает, что мы строим поверхность Безье в по точкам
а затем применяем преобразование
Задача 6.2.1. Наглядно изучить влияние опорных точек и их весов на рациональную поверхность Безье, меняя исходные данные pts (опорные точки) и (их веса) в нижеследующей программе. В матрице весов стоят двумерные векторы, но используется только их первая компонента. Вторая компонента фиксирована. Это связано с неспособностью Mathematica применять функцию BezierFunction к матрицам из скаляров.
Пример 6.2.1. Рациональная поверхность Безье с возможностью непосредственного управления весами с помощью движков.
In[12]: = DynamicModule [ {pts, a, w0, pw, w, g, f, w6, w7, wl0, wll, i, j, out, ins, u, v, n, pts0}, pts = {{{0, 0, 0}, {0, 1, 0), {0, 2, 0}, {0, 3, 0}}, {{1, 0, 0}, {1, 1, 1}, {1, 2, 1}, {1, 3, 0}}, {{2, 0, 0}, {2, 1, 1}, {2, 2, 1}, {2, 3, 0}}, {{3, 0, 0}, {3, 1, 0}, {3, 2, 0} , {3, 3, 0}}}; pts0 = Flatten [pts, 1] ; n = Length [pts0] ; Row[ {Manipulate [w0 = {{{2, a}, {3, a}, {4, a}, {5, a}}, {{3, a}, {w5, a}, {w6, a}, {6, a}}, {{4, a}, {w9, a}, {wl0, a}, {7, a}}, {{9, a}, {12, a}, {14, a}, {32, a}}}; w = Table[w0[ [i, j , 1] ] , {i, 1, 4}, {j, 1, 4}]; pw = Table [w0[ [i, j , 1] ] pts [ [i , j ] ] , {i , 1, 4} , { j , 1, 4} ] ; g = BezierFunction[w0]; f = BezierFunction[pw]; Show[{Graphics3D[{PointSize[Large], Red, Map[Point, pts] , Green, Text[ToString[# - 1] , pts0[[#]] + {0.01, 0.04, 0.04}] & /@ Range[n]}], Graphics3D[{Gray, Dashed, Line[pts], Line[Transpose[pts]]}], ParametrioPlot3D[f [u, v] / g [u, v] [ [1] ] , {u, 0, 1}, {v, 0, 1}, PlotStyle -> FaceForm[out, ins] ] }] , Column[{Control[{{ins, Green, "Внутренний цвет"}, Green}], Control[{{out, Red, "Внешний цвет"}, Red}]}, Right], {{w5, 10}, 1, 100}, {{w6, 10}, 1, 100}, {{w9, 10}, 1, 100}, {{wl0, 10}, 1, 100}] MatrixForm [pts] } , " " ] , Initialization : -> (pts = {{{0, 0, 0}, {0, 1, 0}, {0, 2, 0}, {0, 3, 0}}, {{1, 0, 0}, {1, 1, 1}, {1, 2, 1}, {1, 3, 0}}, {{2, 0, 0}, {2, 1, 1}, {2, 2, 1}, {2, 3, 0}}, {{3, 0, 0}, {3, 1, 0}, {3, 2, 0}, {3, 3, 0}}}; pts0 = Flatten [pts, 1] ; a = 1; n = Length[pts0])]
Геометрический смысл поверхности Безье
Поверхность Безье можно получить следующим образом:
-
Строим (n + 1) кривую Безье по столбцам матрицы
:
- Далее, начиная с каждой точки кривой Безье
строим кривые Безье, имеющие опорные точки на кривых
соответствующие одному и тому же значению параметра u.
При этом соответствующий оператор перехода от опорной точки, взятой на кривой к следующей опорной точке, взятой на кривой
в терминах узлов сетки pij описывается оператором сдвига F по второму индексу. Следовательно,
![S(u,v) = (1-v + Fv)^nr_0(u) = (1-v + Fv)^n (1-u + Eu )^m p_{00} = S_{00}(u,v;m,n),](/sites/default/files/tex_cache/125887610a87c8f4e7d80db8d83b6d8b.png)
где m и n - количество шагов по первому и второму индексу соответственно, начиная от угловой точки сетки Безье, 00 - индекс этой угловой точки, с которой мы начинаем образовывать все остальные узлы сетки операторами сдвига E и F. Имеем
![]() |
( 6.9) |
![]() |
( 6.10) |
Здесь через обозначены четырехугольные листы Безье, построенные из точек p ij, взятых в качестве угловых точек, аналогично формуле (6.9).
Аналогично формуле (6.10), любая точка на поверхности Безье степени m*n может быть представлена в виде точки четырехугольного листа Безье с углами в точках соответственно подобранных поверхностей Безье порядка (m-1)*(n-1):
![S_{00}(u, v; m, n) = (1 - u)(1 - v)S_{00}(u, v;m-1,n- 1)+\\
+ (1 - u)vS_{01}(u, v;m-1,n-1)+u(1- v)S_{10}(u, v;m-1,n- 1)+\\
+ uvS_{11}(u,v;m-1,n-1).](/sites/default/files/tex_cache/909ccea5ed06c7e16016749fedc2ea67.png)
Поверхность Безье можно представить в следующим виде:
![S_{00}(u,v;m,n) = F(u,m)PF^{\top}(v,n),](/sites/default/files/tex_cache/fc315a2f6d48876bb5835de6014bf566.png)
где и
![F(u,m) = (f_0(u,m), \dots ,f_m(u,m) ) ,\\
F(v,n)= ( f_0(v,n), \dots ,f_n(v,n) ) ,\\
f_i ( \xi,k) = C_k^i(1- \xi)^{k-i} \xi^i.](/sites/default/files/tex_cache/15a7691b7fdf5b2067fddf143d17f712.png)
Аналогично обычной поверхности Безье, рациональная поверхность Безье может быть получена с помощью следующего алгоритма:
- соединяем
и
рациональной кривой Безье
с весами
и
;
- соединяем
и
рациональной кривой Безье
с весами
- фиксируем
соединяем точки
и
с весами
и
рациональной кривой Безье и берем на ней точку с параметром
Полученная точка и будет точкой с параметрами на рациональной поверхности Безье, построенной по
Деление поверхности Безье
Деление поверхностей Безье целиком основано на делении кривых Безье. Как мы уже знаем, каждая из кривых Безье (обычных или рациональных), построенных по столбцам сетки опорных точек может быть разделена в параметрической точке
без изменения ее формы. При таком делении получаются две поверхности Безье (составляющие вкупе исходную поверхность) и соответствующие им две матрицы опорных точек Безье, каждая из которых имеет тот же порядок, что и исходная матрица:
и
Затем, каждую из получившихся двух поверхностей Безье надо поделить в параметрической точке
(с помощью деления кривых Безье, построенных по строкам соответствующих матриц). В итоге получится четыре поверхности Безье и соответствующие им четыре матрицы опорных точек:
и
Эти четыре поверхности Безье будут лежать на исходной поверхности Безье, делить ее на четыр
е части и в совокупности составлять исходную поверхность.
Новые сети опорных точек и
получаются из исходной сети
по следующим формулам, аналогичным формулам (5.26):
![p_{ij}^{ac} = (1-u^*+Eu^*)^i(1-v^*+Fv^*)^jp_{00}\\
p_{(m-i)j}^{bc} = ( (1 - u^*)E^{-1} + u^* )^i (1 -v^* + Fv^*)^jp_{m0},\\
p_{i(n-j)}^{ad} = (1-u^*+ Eu^*)^i ( (1 - v^*)F^{-1} + v^* )^j p_{0n},\\
p_{(m -i)(n-j)}^{bd} = ( (1 - u^*)E^{-1} + u^* )^i ( (1 - v^*)F^{-1} + v^* )^j p_{mn}.](/sites/default/files/tex_cache/969fff76e22cb75157c3a74a4766536c.png)