.. role:: blue :class: blue Поверхность с произвольными границами MbCurveBoundedSurface ============================================================ .. _MbCurveBoundedSurface_Surface_with_Arbitrary_Borders: .. версия ядра: 1180ХХ Класс :blue:`MbCurveBoundedSurface` объявлен в файле *surf\_curve\_bounded\_surface.h*. Поверхность :blue:`MbCurveBoundedSurface` описывается базовой поверхностью :blue:`MbSurface` **basisSurface**, множеством граничных кривых RPArray<:ref:`MbContourOnSurface `> **curves** (контуров на поверхности) и граничными значениями параметров *umin*, *umax*, *vmin*, *vmax*, определяющими габаритный прямоугольник области определения параметров. Поверхность :blue:`MbCurveBoundedSurface` имеет криволинейные края и может иметь произвольные вырезы внутри. Границы поверхности описывают контуры на поверхности контейнера **curves**. В методе :blue:`PointOn`\( double *u*, double *v*, :ref:`MbCartPoint3D ` & **s** ) радиус-вектор поверхности **s** описывается векторной функцией .. math:: \mathbf{s}(u, v) = \mathbf{basisSurface}(u, v), \quad u, v \in \Omega, где :math:`\Omega` — область определения параметров, которая представляет собой двумерную связную область. Радиус-вектор ограниченной контурами поверхности описывается тем же законом, что и поверхность **basisSurface**, но имеет другую область определения параметров. Базовая поверхность и контуры на ней приведены на рис. 1: .. figure:: /MODELER/SURFACES/pictures/O.5.27.1.png :width: 12cm :align: center Рис. 1 В общем случае область определения параметров :math:`\Omega` ограниченной контурами поверхности может выходить за область определения параметров поверхности **basisSurface**. Вне области определения параметров поверхности **basisSurface** радиус-вектор **r**\(*u*, *v*) вычисляется методом :blue:`_PointOn`\(*u*, *v*, **s**) в соответствии с правилами продолжения поверхности **basisSurface**. Поверхность с произвольной границей приведена на рис. 2: .. figure:: /MODELER/SURFACES/pictures/O.5.27.2.png :width: 12cm :align: center Рис. 2 Каждая кривая контейнера **curves** описывает одну замкнутую границу поверхности. Каждая кривая контейнера **curves** представляет собой контур на поверхности :ref:`MbContourOnSurface `. Каждый контур на поверхности описывается поверхностью **surface**, совпадающей с **basisSurface**, и двумерным контуром **contour**. Контур **contour** представляет собой составную замкнутую двумерную кривую. Сегментами контура **contour** могут быть любые двумерные кривые :ref:`MbCurve ` за исключением составных кривых :ref:`MbContour `. В общем случае в местах стыковки сегментов производные контура терпят разрыв по длине и направлению. Двумерные контуры описывают границы области определения :math:`\Omega` поверхности :blue:`MbCurveBoundedSurface`. Граничные контуры контейнера **curves** удовлетворяют следующим условиям: они не пересекают сами себя и друг друга, первый контур **curves**\[0] контейнера описывает внешнюю границу и содержит внутри все остальные контуры, которые описывают внутренние вырезы в поверхности. Внутренние контуры не могут быть вложены друг в друга. Для быстрого определения положения некоторой двумерной точки относительно области определения параметров поверхности граничные контуры ориентированы так, что при движении вдоль границы поверхность всегда находится слева, если смотреть навстречу нормали поверхности. Таким образом, внешний контур ориентирован так, что обход по нему осуществляется против движения часовой стрелки, если смотреть на поверхность навстречу её нормали, а внутренние контуры ориентированы в противоположном направлении. Базовой поверхностью **basisSurface** не может быть поверхность с произвольными границами :blue:`MbCurveBoundedSurface`. Если нужно построить поверхность с произвольными границами на основе другой поверхности с произвольными границами, то в качестве базовой поверхности следует использовать базовую поверхность последней.