.. role:: blue :class: blue Контур MbContour3D ================== .. _MbContour3D_Contour: .. версия ядра: Класс :blue:`MbContour3D` объявлен в файле *cur_contour3d.h*. Контур :blue:`MbContour3D` описывается множеством RPArray\<:blue:`MbCurve3D`\> **segments** стыкующихся друг за другом кривых и признаком периодичности кривой *closed*. Контур представляет собой составную кривую. В отличие от других кривых контур может иметь изломы. Кривые, образующие контур, будем называть сегментами. Для сегментов контура выполняются следующие условия: начало каждого последующего сегмента совпадает с концом предыдущего сегмента. Для периодического контура начало первого сегмента совпадает с концом последнего сегмента. В случае, если контур содержит только один сегмент одного из следующих типов, он будет считаться непериодическим: :blue:`MbLine3D`, :blue:`MbLineSegment3D`, :blue:`MbSpiral` и производные от него классы, MbBridgeCurve3D. Для проверки совпадения начальной и конечной точек контура с заданной точностью необходимо использовать метод :blue:`IsTouch`\(), который определяет совпадение независимо от гладкости замыкания. В общем случае в местах стыковки сегментов производные контура терпят разрыв по длине и направлению. Начальное значение параметра контура равно нулю: *t*\ :sub:`min` = 0. Параметрическая длина контура равна сумме параметрических длин составляющих его сегментов: .. math:: t_{\text{max}} = \sum \left( w_{i\text{max}} - w_{i\text{min}} \right), где *w*\ :sub:`imin` и *w*\ :sub:`imax` — минимальное и максимальное значение параметра *i*\-го сегмента. При вычислении радиуса-вектора точки контура сначала по значению параметра определяется рабочий сегмент и значение его локального параметра, далее вычисляется радиус\-вектор рабочего сегмента, который служит радиусом-вектором контура. В методе :blue:`PointOn`\(double & *t*, :ref:`MbCartPoint3D ` & **r**) радиус-вектор кривой **r** описывается векторной функцией .. math:: \mathbf{r}(t) = \mathbf{segments}[k]\bigl(w_{k}\bigr), где **segments**\[k]\(*w*\ :sub:`k`) — рабочий сегмент контура с индексом *k*, *w*\ :sub:`k` — параметр рабочего сегмента, равный .. math:: w_{k} = w_{k\text{min}} + t - \sum_{i = 0}^{k-1} \bigl(w_{i\text{max}} - w_{i\text{min}}\bigr). Сегмент с индексом *k* определяется по значению параметра контура *t* из условия .. math:: \sum_{i = 0}^{k-1} \bigl(w_{i\text{max}} - w_{i\text{min}}\bigr) \leq t < \sum_{i = 0}^{k} \bigl(w_{i\text{max}} - w_{i\text{min}}\bigr), где *w*\ :sub:`imin` и *w*\ :sub:`imax` — минимальное и максимальное значение параметра *i*\-го сегмента. Контур приведён на рисунке: .. figure:: /MODELER/CURVES/pictures/O.4.18.1.png :width: 12cm :align: center В качестве сегментов контура не должны использоваться другие контуры. Если контур нужно построить на основе других контуров, то последние должны рассматриваться как совокупность составляющих их кривых, а не как единые кривые. Контур :blue:`MbContour3D` представляет собой наиболее общий вид кривой.