Поверхность на семействе кривых MbLoftedSurface

Класс MbLoftedSurface объявлен в файле surf_lofted_surface.h.

Поверхность MbLoftedSurface описывается множеством кривых RPArray< MbCurve3D > uCurves, множеством значений второго параметра поверхности для кривых vParams, множеством признаков одинаковых кривых vLabels, граничными значениями параметров umin, umax, vmin, vmax, признаками замкнутости поверхности по первому и второму параметрам uClosed и vClosed, вектором направления непериодической поверхности при vmin MbVector3D derive1, вектором направления непериодической поверхности при vmax MbVector3D derive2, признаками наличия полюсов поверхности на границе области определения poleUMin, poleUMax, poleVMin, poleVMax. У поверхности есть ещё некоторые данные, которые не обязательны и служат для ускорения работы методов поверхности.

Первый параметр поверхности u совпадает с параметрами кривых curves. Все кривые curves должны иметь одинаковую область определения параметра, для этого могут использоваться кривые MbReperamCurve3D. Первый параметр поверхности принимает значения на отрезке umin ≤ u ≤ umax, который соответствует области определения кривых curves. Поверхность может быть периодической по первому параметру, если периодическими являются все кривые множества curves.

Второй параметр поверхности v принимает значения на отрезке vmin ≤ v ≤ vmax. Значение v = vmin соответствует начальному значению множества vParams[0], значение v = vmax соответствует конечному значению множества vParams[vParams.MaxIndex()]. Поверхность может быть периодической по второму параметру.

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

В методе PointOn( double u, double v, MbCartPoint3D & s ) радиус-вектор поверхности s описывается векторной функцией

\begin{equation} \mathbf{s}(u, v) = (1 - 3w^{2} + 2w^{3}) \, \mathbf{curves}[i](u) + (3w^{2} + 2w^{3}) \, \mathbf{curves}[i+1](u) + (w - 2w^{2} + w^{3}) \, \mathbf{derive}[i](u) + \\ (-w^{2} + w^{3}) \, \mathbf{derive}[i+1](u) (\mathit{vParams}[i+1] - \mathit{vParams}[i]), \end{equation}

где

\begin{equation} w = \frac{v - \mathit{vParams[i]}}{\mathit{vParams[i+1]} - \mathit{vParams[i]}}, \end{equation}

derive[i] и derive[i+1] — производные кривых curves[i] и curves[i+1], соответственно. Индекс i рабочего участка для вычисления радиуса-вектора точки и его производных вычисляется из условия vParams[i] ≤ v ≤ vParams[i+1]. Если среди соседних элементов множества vLabels есть одинаковые значения, то между соответствующими кривыми поверхность эквивалентна поверхности выдавливания. Поверхность на семействе кривых приведена на рис. 1:

../../../../_images/O.5.15.1.png

Рис. 1

Форма поверхности зависит от расположения кривых и от множества vParams значений параметров, при которых поверхность проходит по кривым. Для предотвращения самопересечений поверхности необходимо, чтобы значения множества vParams изменялись пропорционально среднему расстоянию между кривыми.

Кривые поверхности s(const, v) с параметрами u = const являются кривыми Эрмита MbHermit3D. Поверхность может иметь полюсы, если первая и/или последняя из кривых curves стянута в точку, или если все кривые curves совпадают на одном из краёв.