.. role:: code :class: code Двумерный контур MbContour ========================== .. _MbContour_Two-Dimensional_Contour: .. версия ядра: 118065 Класс :code:`MbContour` объявлен в файле *cur_contour.h*. Двумерный контур :code:`MbContour` описывается множеством RPArray<:ref:`MbCurve `> **segments** стыкующихся друг с другом кривых и признаком замкнутости кривой **closed**. .. «периодический контур» заменить на «замкнутый контур» ? Двумерный контур представляет собой составную кривую. В отличие от других кривых контур может иметь изломы. Кривые, образующие контур, будем называть **сегментами**. Для сегментов контура выполняются следующие условия: начало каждого последующего сегмента совпадает с концом предыдущего сегмента. Для периодического контура начало первого сегмента совпадает с концом последнего сегмента. В случае, если контур содержит только один сегмент одного из следующих типов, он будет считаться непериодическим: :code:`MbLine`, :code:`MbLineSegment`, :code:`MbCosinusoid`. .. про MbLine, MbLineSegment и MbCosinusoid актуально? Для проверки замкнутости и непрерывности точек контура с заданной точностью следует использовать метод :code:`IsClosedContinuousC0`\(). Метод проверяет совпадение первой и последней точек контура, а также совпадение конца каждого сегмента с началом следующего. Проверка не требует гладкого соединения сегментов. По умолчанию используется точность :code:`5.0 * PARAM_NEAR`. Начальное значение параметра контура равно нулю: *t*\ :subscript:`min` = 0. Параметрическая длина контура равна сумме параметрических длин составляющих его сегментов: .. math:: t_{\text{max}} = \sum\left( w_{i\text{max}} - w_{i\text{min}} \right), где *w*\ :subscript:`i min` и *w*\ :subscript:`i max` — минимальное и максимальное значение параметра *i*-го сегмента. При вычислении радиуса-вектора точки контура сначала по значению параметра определяется рабочий сегмент и значение его локального параметра, далее вычисляется радиус-вектор рабочего сегмента, который служит радиусом-вектором контура. В методе .. code-block:: cpp PointOn( double & t, MbCartPoint & r ) радиус-вектор кривой **r** описывается векторной функцией .. math:: \mathbf{r}(\mathit{t}) = \mathbf{segments}[k](w_{k}), где **segments**\[*k*\]\( *w*\ :subscript:`k` ) — рабочий сегмент контура с индексом *k*, *w*\ :subscript:`k` — параметр рабочего сегмента, равный .. math:: w_{k} = w_{k\text{min}} + t - \sum\limits_{i = 0}^{k - 1} \left( w_{i\text{max}} - w_{i\text{min}} \right). Сегмент с индексом *k* определяется по значению параметра контура *t* из условия .. math:: \sum\limits_{i = 0}^{k - 1} \left( w_{i\text{max}} - w_{i\text{min}} \right) \leq t < \sum\limits_{i = 0}^{k} \left( w_{i\text{max}} - w_{i\text{min}} \right), где *w*\ :subscript:`i min` и *w*\ :subscript:`i max` — минимальное и максимальное значение параметра *i*-го сегмента. Контур приведён на рисунке: .. figure:: ../../pictures/O.3.17.1.png :width: 12cm :align: center В качестве сегментов двумерного контура не должны использоваться другие двумерные контуры. Если контур нужно построить на основе других контуров, то последние должны рассматриваться как совокупность составляющих их кривых, а не как единые кривые.