Геометрические примитивы
Поверхность
Основные понятия
Пусть задана векторная функций двух скалярных переменных ${\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)В дальнейшем предполагается, что векторы ${\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}$, имеем
Зафиксируем значение параметра $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)Обратим внимание на то, что направление вектора нормали связано с принятой параметризацией: первым
мы считаем параметр $u$, а вторыи $v$. Если параметры поменять местами, направление вектора нормали
изменится на противоположное.

Введем скалярные произведения(4)
Выражение $ds^2 = E(u,v)du^2 + 2F(u,v)dudv + G(u,v)dv^2$ — первая квадратичная форма поверхности определяет элемент длины кривой на поверхности:
(5)Площадь области на поверхности также определяется коэффициентами первой квадратичной формы:
(6)Кривизна линии на поверхности. Пусть через некоторую точку $M(u,v)$ на поверхности проходит кривая $u(t)$, $v(t)$. Если в качестве параметра вдоль кривой взять длину $s$ ее дуги, отсчитываемую от некоторой точки, то вдоль линии [[${\bf r}={\bf r}(s)={\bf r}(u(s),v(s)]], и
(7)где ${\bf n}$ — вектор нормали к кривой, а $R$ — кривизна кривой в данной точке. Нормальной кривизной линии на поверхности называется проекция ее вектора кривизны ${\bf n}/R$ на нормаль к поверхности ${\bf N}$ в рассматриваемой точке:
(8)Введем величины
(9)— коэффициенты второй квадратичной формы. Нормальльная кривизна равна
(10)Все линии на поверхности, проходящие через данную точку и обладающие в ней общей касательной, имеют в этой точке одинаковые нормальные кривизны, а радиус кривизны в данной точке любой линии, лежащей на поверхности, равен радиусу кривизны нормального сечения поверхности, проходящего через ту же точку и имеющего с линией общую касательную, умноженному на косинус острого угла между нормалью к линии и нормалью к поверхности в данной точке.
Главные кривизны поверхности. Каждому направлению в данной точке поверхности отвечает определенная нормальная кривизна $1/R_N=k_N$. Возможны следующие ситуации: либо нормальная кривизна не зависит от направления, либо имеются два направления, в которых нормальная кривизна имеет экстремумы. Эти направления называются главными направлениями поверхности в данной точке, а их нормальные кривизны — главными кривизнами в данной точке. Главные направления перпендикулярны друг другу. Обозначим через $k_1$ и $k_2$ главные кривизны. Они являются корнями квадратного уравнения $(EG-F^2) k^2 +(2MF-EN-LG) k + (LN-M^2) = 0$. Отсюда, с помощью формул Виетта, легко получить выражения для суммы и произведения главных кривизн:
(11)Произведение $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)Вот участок кода
//
// Тор малого радиуса 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
А как вычислять площадь поверхности?