.. role:: blue :class: blue Поверхность MbSurface ===================== .. _MbSurface_Surface: .. версия ядра: Класс :blue:`MbSurface` объявлен в файле *surface.h*. Поверхность :blue:`MbSurface` является наследником класса :ref:`MbSpaceItem `, рис. 1. .. figure:: /MODELER/SURFACES/pictures/O.5.1.1.png :width: 12cm :align: center Рис. 1 Поверхность является абстрактным классом. В геометрическом ядре C3D реализованы следующие поверхности, которые являются наследниками класса :blue:`MbSurface`: - :ref:`MbPlane ` — плоскость, - :ref:`MbCylinderSurface ` — цилиндрическая поверхность, - :ref:`MbConeSurface ` — коническая поверхность, - :ref:`MbSphereSurface ` — сферическая поверхность, - :ref:`MbTorusSurface ` — поверхность тора, - :ref:`MbExtrusionSurface ` — поверхность выдавливания, - :ref:`MbRevolutionSurface ` — поверхность вращения, - :ref:`MbExpansionSurface ` — плоскопараллельная кинематическая поверхность, - :ref:`MbSpiralSurface ` — спиральная поверхность, - :ref:`MbEvolutionSurface ` — кинематическая поверхность, - :ref:`MbExactionSurface ` — кинематическая поверхность с адаптацией, - :ref:`MbSectorSurface ` — секториальная поверхность, - :ref:`MbRuledSurface ` — линейчатая поверхность, - :ref:`MbLoftedSurface ` — поверхность на семействе кривых, - :ref:`MbElevationSurface ` — поверхность на семействе кривых и направляющей, - :ref:`MbCornerSurface ` — поверхность на трёх кривых, - :ref:`MbCoverSurface ` — поверхность на четырёх кривых, - :ref:`MbCoonsPatchSurface ` — бикубическая поверхность Кунса, - :ref:`MbMeshSurface ` — поверхность на сети кривых, - :ref:`MbJoinSurface ` — поверхность соединения, - :ref:`MbSplineSurface ` — NURBS-поверхность (NonUniform Rational B-Spline поверхность), - :ref:`MbOffsetSurface ` — эквидистантная поверхность, - :ref:`MbChamferSurface ` — поверхность фаски, - :ref:`MbFilletSurface ` — поверхность скругления, - :ref:`MbChannelSurface ` — поверхность скругления с переменным радиусом, - :ref:`MbCurveBoundedSurface ` — поверхность с произвольными границами. Поверхность :blue:`MbSurface` представляет собой векторную функцию .. math:: \mathbf{surface}(u, v) = \begin{bmatrix} x(u,v) & y(u,v) & z(u,v) \end{bmatrix} двух скалярных параметров *u* и *v*, принимающих значения на двумерной связной области :math:`\Omega`. Поверхность представляет собой непрерывное отображение двумерной связной области :math:`\Omega` в трёхмерное пространство. Область :math:`\Omega` будем описывать в двумерной декартовой системе координат. В частном случае область :math:`\Omega` представляет собой прямоугольник, и параметры поверхности принимают значения в пределах *u*\ :sub:`min` :math:`\leq` *u* :math:`\leq` *u*\ :sub:`max`, *v*\ :sub:`min` :math:`\leq` *v* :math:`\leq` *v*\ :sub:`max`. В общем случае область :math:`\Omega` описывается двумерными кривыми. Координаты *x*\ (*u*, *v*), *y*\ (*u*, *v*), *z*\ (*u*, *v*) точки поверхности **surface**\ (*u*, *v*) являются однозначными непрерывными функциями параметров *u* и *v*. Граничные значения *u*\ :sub:`min`, *u*\ :sub:`max`, *v*\ :sub:`min`, *v*\ :sub:`max` области определения параметров выдают методы поверхности double :blue:`GetUMin`\(), double :blue:`GetUMax`\(), double :blue:`GetVMin`\(), double :blue:`GetVMax`\() соответственно. Поверхность будем называть периодической по первому параметру, если существует *p*\ :sub:`u` > 0, такое, что **surface**\ (*u* ± *kp*\ :sub:`u`, *v*) = **surface**\ (*u*, *v*), где *k* — целое число. Поверхность будем называть периодической по второму параметру, если существует *p*\ :sub:`v` > 0, такое, что **surface**\ (*u*, *v* ± *kp*\ :sub:`v`) = **surface**\ (*u*, *v*), где *k* — целое число. Область определения периодического параметра поверхности лежит в пределах одного периода для соответствующего параметра. Метод bool :blue:`IsUClosed`\() периодической по первому параметру поверхности возвращает *true*. Метод bool :blue:`IsVClosed`\() периодической по второму параметру поверхности возвращает *true*. Метод double :blue:`GetUPeriod`\() периодической по первому параметру поверхности или поверхности, которая может быть расширена до периодической, выдаёт период *p*\ :sub:`u`. Метод double :blue:`GetVPeriod`\() периодической по второму параметру поверхности или поверхности, которая может быть расширена до периодической, выдаёт период *p*\ :sub:`v`. Область определения параметра периодической поверхности всегда лежит в пределах одного периода. Введём обозначения .. math:: s_{u} = \frac{\partial\mathbf{surface}(u,v)}{\partial u}; .. math:: s_{v} = \frac{\partial\mathbf{surface}(u,v)}{\partial v}; .. math:: s_{uu} = \frac{\partial^{2}\mathbf{surface}(u,v)}{\partial u^{2}}; .. math:: s_{vv} = \frac{\partial^{2}\mathbf{surface}(u,v)}{\partial v^{2}}; .. math:: s_{uv} = \frac{\partial^{2}\mathbf{surface}(u,v)}{\partial u \partial v} = \frac{\partial^{2}\mathbf{surface}(u,v)}{\partial v \partial u}; .. math:: s_{uuu} = \frac{\partial^{3}\mathbf{surface}(u,v)}{\partial u^{3}}; .. math:: s_{uuv} = \frac{\partial^{3}\mathbf{surface}(u,v)}{\partial u \partial u \partial v}; .. math:: s_{uvv} = \frac{\partial^{3}\mathbf{surface}(u,v)}{\partial u \partial v \partial v}; .. math:: s_{vvv} = \frac{\partial^{3}\mathbf{surface}(u,v)}{\partial v^{3}} для частных производных поверхности по её параметрам. Основным методом поверхности является метод void :blue:`PointOn`\( double \& *u*, double \& *v*, :ref:`MbCartPoint3D ` \& **s** ). Он выдаёт радиус-вектор **s**\ (*u*, *v*) точки поверхности для заданных параметров *u* и *v*. Методы void :blue:`DeriveU`\( double \& *u*, double \& *v*, :ref:`MbVector3D ` \& **s**\ :sub:`u` ), void :blue:`DeriveV`\( double \& *u*, double \& *v*, :ref:`MbVector3D ` \& **s**\ :sub:`v` ), void :blue:`DeriveUU`\( double \& *u*, double \& *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uu` ), void :blue:`DeriveUV`\( double \& *u*, double \& *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uv` ), void :blue:`DeriveVV`\( double \& *u*, double \& *v*, :ref:`MbVector3D ` \& **s**\ :sub:`vv` ), void :blue:`DeriveUUU`\( double \& *u*, double \& *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uuu` ), void :blue:`DeriveUUV`\( double \& *u*, double \& *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uuv` ), void :blue:`DeriveUVV`\( double \& *u*, double \& *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uvv` ), void :blue:`DeriveVVV`\( double \& *u*, double \& *v*, :ref:`MbVector3D ` \& **s**\ :sub:`vvv` ) выдают соответственно производные **s**\ :sub:`u`, **s**\ :sub:`v`, **s**\ :sub:`uu`, **s**\ :sub:`uv`, **s**\ :sub:`vv`, **s**\ :sub:`uuu`, **s**\ :sub:`uuv`, **s**\ :sub:`uvv`, **s**\ :sub:`vvv` радиуса-вектора поверхности для заданных параметров *u* и *v*. Перечисленные методы корректируют параметры поверхности при их выходе за пределы области определения (исключение составляет плоскость :ref:`MbPlane `). При выходе параметра *u* за пределы отрезка [*u*\ :sub:`min`, *u*\ :sub:`max`] непериодические по первому параметру поверхности смещают параметр *u* к ближайшей границе *u*\ :sub:`min` или *u*\ :sub:`max`, а периодические по первому параметру поверхности добавляют или вычитают необходимое количество периодов. При выходе параметра *v* за пределы отрезка [*v*\ :sub:`min`, *v*\ :sub:`max`] непериодические по второму параметру поверхности смещают параметр *v* к ближайшей границе *v*\ :sub:`min` или *v*\ :sub:`max`, а периодические по второму параметру поверхности добавляют или вычитают необходимое количество периодов. Метод void :blue:`_PointOn`\( double *u*, double *v*, :blue:`MbCartPoint3D` \& **s** ) выдаёт радиус-вектор **s**\ (*u*, *v*) точки поверхности для заданных параметров *u* и *v* как в области определения параметров поверхности, так и за её пределами. Каждая непериодическая поверхность за пределами области определения параметров продолжается по своему закону. При отсутствии такого закона (в общем случае) непериодическая поверхность за пределами области определения параметров продолжается по касательной к соответствующей крайней точке поверхности. Методы void :blue:`_DeriveU`\( double *u*, double *v*, :ref:`MbVector3D ` \& **s**\ :sub:`u` ), void :blue:`_DeriveV`\( double *u*, double *v*, :ref:`MbVector3D ` \& **s**\ :sub:`v` ), void :blue:`_DeriveUU`\( double *u*, double *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uu` ), void :blue:`_DeriveUV`\( double *u*, double *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uv` ), void :blue:`_DeriveVV`\( double *u*, double *v*, :ref:`MbVector3D ` \& **s**\ :sub:`vv` ), void :blue:`_DeriveUUU`\( double *u*, double *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uuu` ), void :blue:`_DeriveUUV`\( double *u*, double *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uuv` ), void :blue:`_DeriveUVV`\( double *u*, double *v*, :ref:`MbVector3D ` \& **s**\ :sub:`uvv` ), void :blue:`_DeriveVVV`\( double *u*, double *v*, :ref:`MbVector3D ` \& **s**\ :sub:`vvv` ) выдают соответственно производные **s**\ :sub:`u`, **s**\ :sub:`v`, **s**\ :sub:`uu`, **s**\ :sub:`uv`, **s**\ :sub:`vv`, **s**\ :sub:`uuu`, **s**\ :sub:`uuv`, **s**\ :sub:`uvv`, **s**\ :sub:`vvv` радиуса-вектора поверхности для заданных параметров *u* и *v* как в области определения поверхности, так и за её пределами. Поверхности перегружают такие методы трёхмерного геометрического объекта как: методы, обслуживающие преобразование геометрического объекта void :blue:`Move`\( const :ref:`MbVector3D ` \& **v**, MbRegTransform \* iReg = NULL ), void :blue:`Rotate`\( const MbAxis3D \& **axis**, double **angle**, MbRegTransform \* iReg = NULL ), void :blue:`Transform`\( const :ref:`MbMatrix3D ` \& **m**, MbRegTransform \* iReg = NULL ), методы, обеспечивающие копирование, проверку на совпадение, проверку на возможность сделать совпадающими, делающие объекты совпадающими, :blue:`MbSpaceItem` \& :blue:`Duplicate`\( MbRegDuplicate \* iReg = NULL ), bool :blue:`IsSame`\( const :ref:`MbSpaceItem ` \& **item** ), bool :blue:`IsSimilar`\( const :ref:`MbSpaceItem ` \& **item** ), bool :blue:`SetEqual`\( const :ref:`MbSpaceItem ` \& **item** ), методы, возвращающие тип из перечисления геометрических объектов, MbeSpaceType :blue:`IsA`\(), MbeSpaceType :blue:`Type`\(), MbeSpaceType :blue:`Family`\(), методы, обеспечивающие выдачу и редактирование внутренних данных объекта, MbProperty \& :blue:`CreateProperty`\( MbePrompt name ), void :blue:`GetProperties`\( MbProperties \& *properties* ), void :blue:`SetProperties`\( MbProperties \& *properties* ), метод, наполняющий полигональную копию геометрического объекта, void :blue:`CalculateWire`\( double sag, :ref:`MbMesh ` \& **mesh** ). Большинство поверхностей имеют прямоугольную область определения параметров. Среди всех поверхностей выделим :ref:`MbCurveBoundedSurface `, которая является универсальной поверхностью. :ref:`MbCurveBoundedSurface ` имеет криволинейные края и может иметь произвольные вырезы внутри. :blue:`MbCurveBoundedSurface` строится на основе любой поверхности с прямоугольной областью определения параметров.