Геометрические примитивы
Интерполяционные поверхности
Построение интерполяционных поверхностей использует те же идеи, что и построение интерполяционных кривых. Общая схема состоит в следующем. Пусть на некоторой сетке $(u_k, v_k)$ в области параметров $(u, v)$ заданы значения точек поверхности: $\mathbf{r}_k$. Задача состоит в построении поверхности $\mathbf{r}(u, v)$, принимающей в указанных точках заданные значения: $\mathbf{r}_k = \mathbf{r}(u_k, v_k)$. Интерполяционная функция строится в виде
(1)где коэффициенты $c_k(u,v)$ зависят от сетки в области параметров, но не зависят от положения точек $\mathbf{r}_k$ на поверхности. Как уже обсуждалось для кривых (см. Кривые: интерполяция и аппроксимация), интерполяционные коэффициенты $c_k(u,v)$ должны обладать рядом свойств:
- поскольку коэффициенты не зависят от положения точек, должны выполняться условия $c_k(u_l, v_l) = \delta_{kl}$, т.е. функция $c_k$ должна обращаться в нуль во всех узлах $l$ сетки, кроме узла $k$, в котором она должна иметь значение единица;
- естественно требовать, чтобы в случае набора совпадающих точек $\mathbf{r}_k$ интерполяционная поверхность представляла собой эту точку. Отсюда следует условие $\sum_{k} c_k(u, v) = 1$;
- желательно, чтобы функции $c_k(u, v)$ были непрерывны и имели непрерывные производные.
Линейчатая поверхность
Пусть заданы две кривые $\mathbf{r}_1(u)$ и $\mathbf{r}_2(u)$ с согласованной параметризацией $0 \le u \le 1$. Мы можем построить поверхность, соединив прямыми точки на кривых с одинаковым значением параметра: $\mathbf{r}(u,v) = (1-v)\mathbf{r}_1(u) + v\mathbf{r}_2(u)$. Кривые $\mathbf{r}_1(u)$ и $\mathbf{r}_2(u)$ служат границами участка поверхности: $\mathbf{r}(u,0)=\mathbf{r}_1(u)$, $\mathbf{r}(u,1)=\mathbf{r}_2(u)$ (см. подробнее Линейчатая поверхность).
Если кривые — отрезки прямых, то речь идет о построении поверхности, натянутую на линейную рамку, заданную четырьмя точками в пространстве: $\mathbf{r}(0,0)$, $\mathbf{r}(1,0)$, $\mathbf{r}(0,1)$, $\mathbf{r}(1,1)$. Это поверхность линейная по каждому параметру, т.е. билинейная:
(2)Обратим внимание на то, что, несмотря на линейную интерполяцию, поверхность, вообще говоря, не плоская ни в одном из направлений.
Линейная поверхность Кунса
Рассмотрим способ построения поверхности $\mathbf{r}(u,v)$ по четырем кривым, заданным на границах единичного квадрата в плоскости параметров: $\mathbf{r}_1(u)=\mathbf{r}(u,0)$, $\mathbf{r}_2(u)=\mathbf{r}(u,1)$, $\mathbf{r}_3(v)=\mathbf{r}(0,v)$, $\mathbf{r}_4(v)=\mathbf{r}(1,v)$. Обратим внимание на то, что
конечные точки кривых совпадают. Возьмем вначале кривые $\mathbf{r}_3(v)$ и $\mathbf{r}_4(v)$ на сторонах $u=0$ и $u=1$ и построим линейчатую поверхность, интерполируя в направлении параметра $u$:
Интерполируя аналогично в направлении $v$, построим вторую поверхность:
(4)Легко проверить, что сумма этих функций отличается на границах от требумых значений как раз на значения билинейной поверхности, образованной угловыми точками:
(5)Итак, искомая интерполяционная поверхность (линейная поверхность Кунса (Coons patch) ) имеет вид:
(6)В этом выражении функции, заданные на границе, линейно интерполируются внутрь области по каждому направлению, т.е. строится билинейная интерполяция.
Кубическая поверхность Кунса
В предыдущем выражении множители у граничных кривых есть веса, указывающие влияние данной граничной точки на значение внутри области. Вообще говоря, интерполяцию можно выполнять и с использованием других весовых
функций, заменяя $u$ на $f(u)$, а $v$ на $g(v)$. От этих функций естественно требовать, чтобы $f(0)=0$, $f(1)=1$ и чтобы функция $f(u)$ была монотонно возрастающей. То же самое относится к $g(v)$.
Как уже говорилось выше, одна из задач построения поверхности, заключается в следующем. Пусть имеется прямоугольная область в плоскости параметров $(a \le u \le b, c \le v \le d)$ и в ней прямоугольная сетка $a = u_0 < u_1 , \ldots < u_{n-1} < u_n =b$, $c = v_0 < v_1 , \ldots < v_{m-1} < v_m =d$. Пусть на линиях этой сетки заданы гладкие кривые, по которым нужно сформировать поверхность: $\mathbf{r}_i(v)=\mathbf{r}(u_i,v)$, $\mathbf{r}_j(u)=\mathbf{r}(u,v_j)$ — всего $(n+1)\times(m+1)$ кривых. Формула (6) позволяет построить отдельные куски такой поверхности для области значений параметра $u_i \le u \le u_{i+1}, v_j \le v \le v_{j+1}$. Эти куски сшиваются друг с другом непрерывно, но производная поверхности на линиях раздела участков, вообще говоря, терпит разрыв. Чтобы обеспечить непрерывность первой производной (непрерывность изменения нормали) при переходе через границу кусков, можно использовать весовые функции специального вида.
Для получения гладкой поверхности (с непрерывной первой производной) достаточно использовать поверхность описанного вида с весовыми функциями, имеющими нулевые производные на концах интервала: $f'(0) = 0$, $f'(1) = 0$, $g'(0) = 0$, $g'(1) = 0$. В качестве таких функций можно взять кубические многочлены Эрмита (см. Кривые: интерполяция и аппроксимация) $f(u) = H_{00}(u)$, $1-f(u) = H_{10}(u)$, $g(v) = H_{00}(v)$, $1-g(v) = H_{10}(v)$ так что интерполяционная поверхность задается выражением
(7)