RU: Surface

Геометрические примитивы

Поверхность

Основные понятия

Пусть задана векторная функций двух скалярных переменных ${\bf a}(u,v)$. Если векторы ${\bf a}(u,v)$ откладывать от фиксированной точки $O$ в пространстве, то при изменении аргументов конец вектора будет описывать некоторую поверхность. Зависимость ${\bf r}={\bf a}(u,v)$ называется параметрическим уравнением поверхности. Если ввести декартову систему координат, то задание уравнения поверхности эквивалентно заданию трех функций — координат радиус-вектора ${\bf r}(u,v) = x(u,v){\bf i} + y(u,v){\bf j} + z(u,v){\bf k}$. Функции $x(u,v)$, $y(u,v)$, $z(u,v)$ мы будем предполагать непрерывными и дифференцируемыми.

Введем обозначения для частных производных

(1)
\begin{align} {\bf r}_u \equiv \frac{\partial {\bf r}}{\partial u}= \frac{\partial x}{\partial u}{\bf i} + \frac{\partial y}{\partial u}{\bf j} + \frac{\partial z}{\partial u}{\bf k}, \qquad {\bf r}_v \equiv \frac{\partial {\bf r}}{\partial v}= \frac{\partial x}{\partial v}{\bf i} + \frac{\partial y}{\partial v}{\bf j} + \frac{\partial z}{\partial v}{\bf k} \end{align}

В дальнейшем предполагается, что векторы ${\bf r}_u$ и ${\bf r}_v$ не обращаются в нуль и не коллинеарны.
Отметим, что если уравнение поверхности имеет вид $z=f(x,y)$, то параметрами служат координаты $(x,y)$ точки на плоскости. При этом, обозначая $p \equiv \frac{\partial f}{\partial x}$ , $q \equiv \frac{\partial f}{\partial y}$, имеем

(2)
\begin{align} {\bf r}_x \equiv \frac{\partial {\bf r}}{\partial x}={\bf i} + p{\bf k}, \qquad {\bf r}_y \equiv \frac{\partial {\bf r}}{\partial y}= {\bf j} + q{\bf k} \end{align}

Зафиксируем значение параметра $u=u_0$ и будем изменять параметр $v$. Вектор ${\bf r}(u_0,v)$ будет описывать кривую, лежащую на поверхности, так называемую $v$-линию. Изменяя значения параметра $u_0$ мы получим семейство $v$-линий. Аналогично, фиксируя значение параметра $v=v_0$, мы получим на поверхности $u$-линию.

Таким образом, поверхность оказывается покрытой сетью $u$- и $v$-линий — параметрической сетью. Через каждую точку поверхности проходят одна $u$-линия и одна $v$-линия.Касательная плоскость к поверхности в некоторой точке определяется векторами частных производных ${\bf r}_u$ и ${\bf r}_v$. Вектором нормали к поверхности в данной точке назывется единичный вектор, перпендикулярный касательной плоскости к поверхности в этой точке:

(3)
\begin{align} {\bf N} = \frac{{[{\bf r}_u ,{\bf r}_v ]}}{{|[{\bf r}_u ,{\bf r}_v ]|}} \end{align}

Обратим внимание на то, что направление вектора нормали связано с принятой параметризацией: первым
мы считаем параметр $u$, а вторыи $v$. Если параметры поменять местами, направление вектора нормали
изменится на противоположное.

Fig0203.jpg

Введем скалярные произведения(4)
\begin{align} E(u,v) = ({\bf r}_u ,{\bf r}_u ), \qquad F(u,v) = ({\bf r}_u ,{\bf r}_v ), \qquad G(u,v) = ({\bf r}_v ,{\bf r}_v ) \end{align}

Выражение $ds^2 = E(u,v)du^2 + 2F(u,v)dudv + G(u,v)dv^2$первая квадратичная форма поверхности определяет элемент длины кривой на поверхности:

(5)
\begin{align} s = \int\limits_{t_1}^{t_2} \left|{\bf r}' \right|dt = \int\limits_{t_1}^{t_2}{ \sqrt{E\left(\frac{du}{dt}\right)^2 + 2F\frac{du}{dt}\frac{dv}{dt} + G\left(\frac{dv}{dt}\right)^2}}dt \end{align}

Площадь области на поверхности также определяется коэффициентами первой квадратичной формы:

(6)
\begin{align} S(D) = \int\limits_D {\sqrt {EG - F^2 } dudv} \end{align}

Кривизна линии на поверхности. Пусть через некоторую точку $M(u,v)$ на поверхности проходит кривая $u(t)$, $v(t)$. Если в качестве параметра вдоль кривой взять длину $s$ ее дуги, отсчитываемую от некоторой точки, то вдоль линии [[${\bf r}={\bf r}(s)={\bf r}(u(s),v(s)]], и

(7)
\begin{align} \frac{d^2{\bf r}}{ds^2}=\frac{{\bf n}}{R} \end{align}

где ${\bf n}$ — вектор нормали к кривой, а $R$ — кривизна кривой в данной точке. Нормальной кривизной линии на поверхности называется проекция ее вектора кривизны ${\bf n}/R$ на нормаль к поверхности ${\bf N}$ в рассматриваемой точке:

(8)
\begin{align} \frac{1}{R_N}=\frac{1}{R}({\bf n},{\bf N}), \qquad \text{или} \qquad \frac{1}{R_N}=\frac{(d^2{\bf r},{\bf N})}{ds^2} \end{align}

Введем величины

(9)
\begin{align} L(u,v)=({\bf r}_{uu},{\bf N}), \qquad M(u,v)=({\bf r}_{uv},{\bf N}), \qquad N(u,v)=({\bf r}_{vv},{\bf N}) \end{align}

— коэффициенты второй квадратичной формы. Нормальльная кривизна равна

(10)
\begin{align} \frac{1}{R_N}=\frac{Ldu^2+2Mdudv+Ndv^2}{Edu^2+2Fdudv+Gdv^2} = L\left(\frac{du}{ds}\right)^2+ 2M\frac{du}{ds}\frac{dv}{ds}+N\left(\frac{dv}{ds}\right)^2 \end{align}

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

Главные кривизны поверхности. Каждому направлению в данной точке поверхности отвечает определенная нормальная кривизна $1/R_N=k_N$. Возможны следующие ситуации: либо нормальная кривизна не зависит от направления, либо имеются два направления, в которых нормальная кривизна имеет экстремумы. Эти направления называются главными направлениями поверхности в данной точке, а их нормальные кривизны — главными кривизнами в данной точке. Главные направления перпендикулярны друг другу. Обозначим через $k_1$ и $k_2$ главные кривизны. Они являются корнями квадратного уравнения $(EG-F^2) k^2 +(2MF-EN-LG) k + (LN-M^2) = 0$. Отсюда, с помощью формул Виетта, легко получить выражения для суммы и произведения главных кривизн:

(11)
\begin{align} K &= k_1 k_2 = \frac{LN-M^2}{EG-F^2} & 2H &= k_1 + k_2 = -\frac{2MF-EN-LG}{EG-F^2} \end{align}

Произведение $K = k_1 k_2$ главных кривизн называется полной или гауссовой кривизной поверхности в данной точке. Полусумма $H = 0.5(k_1 + k_2)$ главных кривизн называется средней кривизной поверхности. Кривизна $k_N$ нормального сечения выражается через главные кривизны и угол $\varphi$, образуемый касательной этого нормального сечения с первым главным направлением: $k_N=k_1\cos^2 \varphi+k_2\sin^2 \varphi$

Описание поверхности в OpenCascade

В OpenCascade описание поверхности основывается на абстрактном классе Geom_Surface. Этот класс фиксирует набор методов производных классов, относящихся к

  • параметрическому уравнению поверхности, т.е. вычислению по значению параметров точки на поверхности, частных производных, кривизны и т.д.;
  • получению информации о глобальных свойствах поверхности: гладкость, замкнутость, периодичность, дапазон изменения параметров;
  • выполнению преобразований над поверхностью и ее параметризацией.

Рассмотрим на примерах некоторые из методов. Метод Value(const Standard_Real U,const Standard_Real V) возвращает значение точки на поверхности для заданных значений параметров. Методы D0, D1 … позволяют узнать значения точки и производных различного порядка.

// Сфера единичного радиуса
   Geom_SphericalSurface geomSphere(gp::XOY(), 1.);
//
// Границы изменения параметров
   Standard_Real uBounds[2], vBounds[2];
   geomSphere.Bounds(uBounds[0],uBounds[1],vBounds[0],vBounds[1]);
   // uBounds = 0.0000, 6.2831, vBounds = -1.5707, 1.5707
//
// Периодичность по первому параметру
   Standard_Boolean isUPeriodic = geomSphere.IsUPeriodic();    // True
   Standard_Real uPeriod = geomSphere.UPeriod();               // 6.2831
//
// Найдем точку и векторы производных для некоторого значения параметров
   Standard_Real phi, theta;
   gp_Pnt point;   gp_Vec deriv[2];
   phi = PI / 4.;   theta = PI / 4.;
// Должны получиться эти значения координат точки
   double x = cos(phi)*cos(theta);   //   0.5000
   double y = sin(phi)*cos(theta);   //   0.5000
   double z = sin(theta);            //   0.7071
//
   geomSphere.D1(phi,theta,point,deriv[0],deriv[1]);

Методы UIso(const Standard_Real U) и VIso(const Standard_Real V) строят линии параметрической сети.

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

Выполним некоторые вычисления для тора. Напомним, что положение точки на торе определяется значениями двух параметров: $\varphi$ и $\psi$. Каждый из них изменяется от $0$ до $2\pi$ и по каждому поверхность периодична. Поверхность определяется значениями двух радиусов: малый радиус $r$ и радиус центров $R$, $r \le R$. Уравнение поверхности тора имеет вид

(12)
\begin{align} x &= (R + r\cos{\psi} )\cos{\varphi} , & y &= (R + r\cos{\psi} )\sin{\varphi} , & z &= r\sin{\psi} \end{align}

Вот участок кода

//
// Тор малого радиуса r=1 и радиуса центров R=2
   Standard_Real R, r;
   R = 2.;   r = 1.;
   Handle(Geom_ToroidalSurface) torus = new Geom_ToroidalSurface(gp::XOY(), R, r);
//
// Границы изменения параметров
   Standard_Real uBounds[2], vBounds[2];
   torus->Bounds(uBounds[0],uBounds[1],vBounds[0],vBounds[1]);
   // uBounds = 0.0000, 6.2831, vBounds = 0.0000, 6.2831
//
// Периодичность по первому параметру
   Standard_Boolean isUPeriodic = torus->IsUPeriodic();    // True
   Standard_Real uPeriod = torus->UPeriod();               // 6.2831
//
// Вычислим характеристики поверхности
   Standard_Real phi, psi;
   phi = PI / 4.;   psi = PI / 4.;
   GeomLProp_SLProps torusProps( torus, phi, psi, 2, 1.e-8);
//
// Найдем точку для некоторого значения параметров
   gp_Pnt point;
// Должны получиться эти значения координат точки
   double x = (R + r*cos(psi) )*cos(phi);    //   1.9142
   double y = (R + r*cos(psi) )*sin(phi);    //   1.9142
   double z = r*sin(psi);                    //   0.7071
//
   point = torusProps.Value();
//
   Standard_Real maxCurvature   = torusProps.MaxCurvature ();   // -0.2612
   Standard_Real minCurvature   = torusProps.MinCurvature ();   // -1.0000

А как вычислять площадь поверхности?