Двумерный контур MbContour

Класс MbContour объявлен в файле cur_contour.h.

Двумерный контур MbContour описывается множеством RPArray<MbCurve> segments стыкующихся друг с другом кривых и признаком замкнутости кривой closed.

Двумерный контур представляет собой составную кривую. В отличие от других кривых контур может иметь изломы. Кривые, образующие контур, будем называть сегментами. Для сегментов контура выполняются следующие условия: начало каждого последующего сегмента совпадает с концом предыдущего сегмента. Для периодического контура начало первого сегмента совпадает с концом последнего сегмента. В случае, если контур содержит только один сегмент одного из следующих типов, он будет считаться непериодическим: MbLine, MbLineSegment, MbCosinusoid.

Для проверки замкнутости и непрерывности точек контура с заданной точностью следует использовать метод IsClosedContinuousC0(). Метод проверяет совпадение первой и последней точек контура, а также совпадение конца каждого сегмента с началом следующего. Проверка не требует гладкого соединения сегментов. По умолчанию используется точность 5.0 * PARAM_NEAR.

Начальное значение параметра контура равно нулю: tmin = 0. Параметрическая длина контура равна сумме параметрических длин составляющих его сегментов:

\[t_{\text{max}} = \sum\left( w_{i\text{max}} - w_{i\text{min}} \right),\]

где wi min и wi max — минимальное и максимальное значение параметра i-го сегмента. При вычислении радиуса-вектора точки контура сначала по значению параметра определяется рабочий сегмент и значение его локального параметра, далее вычисляется радиус-вектор рабочего сегмента, который служит радиусом-вектором контура.

В методе

PointOn( double &      t,
         MbCartPoint & r )

радиус-вектор кривой r описывается векторной функцией

\[\mathbf{r}(\mathit{t}) = \mathbf{segments}[k](w_{k}),\]

где segments[k]( wk ) — рабочий сегмент контура с индексом k, wk — параметр рабочего сегмента, равный

\[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 из условия

\[\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),\]

где wi min и wi max — минимальное и максимальное значение параметра i-го сегмента.

Контур приведён на рисунке:

../../../../_images/O.3.17.1.png

В качестве сегментов двумерного контура не должны использоваться другие двумерные контуры. Если контур нужно построить на основе других контуров, то последние должны рассматриваться как совокупность составляющих их кривых, а не как единые кривые.