.. role:: code :class: code Кривая MbCurve3D ================ .. _MbCurve3D_Curve: .. версия ядра: 118065 Класс :code:`MbCurve3D` объявлен в файле *curve3d.h*. Кривая :code:`MbCurve3D` является наследником классов :ref:`MbSpaceItem ` и :code:`MbNestSyncItem`: .. figure:: ../../pictures/O.4.1.1.png :width: 15cm :align: center Кривая является абстрактным классом. В геометрическом ядре C3D реализованы следующие кривые, которые являются наследниками класса :code:`MbCurve3D`: :ref:`MbLine3D ` -- прямая линия; :ref:`MbLineSegment3D ` -- отрезок прямой; :ref:`MbArc3D ` -- дуга эллипса; :ref:`MbPolyline3D ` -- ломаная линия; :ref:`MbNurbs3D ` -- B-кривая (NonUniform Rational B-Spline); :ref:`MbBezier3D ` -- составная кривая Безье; :ref:`MbHermit3D ` -- кривая Эрмита; :ref:`MbCubicSpline3D ` -- кубический сплайн; :ref:`MbOffsetCurve3D ` -- эквидистантная кривая; :ref:`MbTrimmedCurve3D ` -- усеченная кривая; :ref:`MbReparamCurve3D ` -- репараметризованная кривая; :ref:`MbConeSpiral ` -- коническая спираль; :ref:`MbCurveSpiral ` -- спираль с прямолинейной осью и переменным радиусом; :ref:`MbCrookedSpiral ` -- спираль с осью в виде плоской кривой; :ref:`MbBridgeCurve3D ` -- сплайн Эрмита, соединяющий две кривые; :ref:`MbContour3D ` -- контур (составная кривая); :ref:`MbPlaneCurve ` -- плоская кривая в пространстве; :ref:`MbSurfaceCurve ` -- кривая на поверхности; :ref:`MbSilhouetteCurve ` -- силуэтная кривая поверхности; :ref:`MbContourOnSurface ` -- контур на поверхности; :ref:`MbContourOnPlane ` -- контур на плоскости; :ref:`MbSurfaceIntersectionCurve ` -- кривая пересечения поверхностей. Кривая :code:`MbCurve3D` представляет собой векторную функцию .. math:: \mathbf{\text{curve}}(t) = \begin{bmatrix} x(t) & y(t) & z(t) \end{bmatrix} скалярного параметра *t*, принимающего значения на отрезке [*t*\ :subscript:`min`, *t*\ :subscript:`max`]. Кривая представляет собой непрерывное отображение некоторого участка числовой оси в трёхмерное пространство. Область изменения параметра кривой есть отрезок [*t*\ :subscript:`min`, *t*\ :subscript:`max`] в одномерном пространстве. Координаты *x*\(*t*\), *y*\(*t*\), *z*\(*t*\) точки кривой **curve**\(*t*\) являются однозначными непрерывными функциями параметра *t*. Граничные значения *t*\ :subscript:`min` и *t*\ :subscript:`max` области определения параметра выдают методы кривой double :code:`GetTMin`\() и double :code:`GetTMax`\(), соответственно. Кривую будем называть периодической, если существует *p* > 0, такое, что **curve**\(*t* ± *kp*) = **curve**\(*t*\), где *k* — целое число. Методы .. code-block:: cpp bool IsPeriodic() и .. code-block:: cpp bool IsClosed() периодической кривой возвращают *true*. Метод .. code-block:: cpp double GetPeriod() периодической кривой или кривой, которая может быть расширена до периодической, выдает период *p*. Область определения параметра периодической кривой всегда лежит в пределах одного периода. .. может так (в хэдере про кривую, которая может быть расширена до периодической, ничего нет)?: .. Метод :code:`GetPeriod`\() возвращает период *p* периодической кривой. Для непериодической кривой метод возвращает 0. Кривая считается периодической, если: - Начальная и конечная точки кривой совпадают. 3D кривые следующих типов не считаются периодическими при совпадении начальной и конечной точки, например в случае вырожденной кривой; для них методы :code:`IsClosed`\(), :code:`IsPeriodic`\() всегда возвращают *false*: .. IsPeriodic() также всегда возвращает *false*. Зачем 2 метода определения периодичности? - :ref:`MbLine3D `; - :ref:`MbLineSegment3D `; - :code:`MbSpiral` и производные классы; - :ref:`MbBridgeCurve3D `; - :ref:`MbContour3D `, в случае если он содержит только один сегмент одного из указанных выше типов. - Производные в начальной и конечной точках совпадают. Если по своей природе кривая допускает изломы (контур, ломаная), то допускается несовпадение производных. У кривой Безье производные должны совпадать по направлению, но могут не совпадать по модулю. Для проверки совпадения начальной и конечной точек кривой с заданной точностью необходимо использовать метод :code:`IsTouch`\(), который определяет совпадение независимо от гладкости замыкания. Основным методом кривой является метод .. code-block:: cpp void PointOn( double & t, MbCartPoint3D & r ); Он выдаёт радиус-вектор **r** точки кривой для заданного параметра *t*. Методы .. code-block:: cpp void FirstDer( double & t, MbVector3D & rt ); void SecondDer( double & t, MbVector3D & rtt ); void ThirdDer( double & t, MbVector3D & rttt ); выдают соответственно первую **r** \ :subscript:`t`, вторую **r** \ :subscript:`tt` и третью **r** \ :subscript:`ttt` производные радиуса-вектора кривой для заданного параметра *t*. Перечисленные методы корректируют параметр кривой при его выходе за пределы области определения (исключение составляет прямая :code:`MbLine3D`). При выходе параметра *t* кривой за пределы отрезка [*t*\ :subscript:`min`, *t*\ :subscript:`max`] непериодические кривые смещают параметр *t* к ближайшей границе *t*\ :subscript:`min` или *t*\ :subscript:`max`, а периодические кривые добавляют или вычитают необходимое количество периодов. Метод .. code-block:: cpp void _PointOn( double t, MbCartPoint3D & r ); выдаёт радиус-вектор **r** точки кривой для заданного параметра *t* как в области определения параметра кривой, так и за её пределами. В общем случае непериодическая кривая за пределами области определения параметра продолжается по касательной в крайней точке. Исключение составляют периодические кривые, дуга :code:`MbArc3D`, спирали MbSpiral, символьная кривая :code:`MbCharacterCurve3D` и усечённая кривая :code:`MbTrimmedCurve3D` в пределах базовой кривой. Периодические кривые за пределами области определения параметра продолжаются циклически. Методы .. code-block:: cpp void _FirstDer( double t, MbVector3D & rt ); void _SecondDer( double t, MbVector3D & rtt ); void _ThirdDer( double t, MbVector3D & rttt ); выдают соответственно первую **r** \ :subscript:`t`, вторую **r** \ :subscript:`tt` и третью **r** \ :subscript:`ttt` производные радиуса-вектора кривой для заданного параметра *t* как в области определения кривой, так и за её пределами. Кривые перегружают такие методы трёхмерного геометрического объекта, как: методы, обслуживающие преобразование геометрического объекта, .. code-block:: cpp void Move( const MbVector3D & to, MbRegTransform * iReg = nullptr ); void Rotate( const MbAxis3D & axis, double angle, MbRegTransform * iReg = nullptr ); void Transform( const MbMatrix3D & matr, MbRegTransform * iReg = nullptr ); методы, обеспечивающие копирование, проверку на совпадение, проверку на возможность сделать совпадающими, делающие объекты совпадающими: .. code-block:: cpp MbSpaceItem & Duplicate( MbRegDuplicate * iReg = nullptr ); bool IsSame( const MbSpaceItem & other, double accuracy = LENGTH_EPSILON ); bool IsSimilar( const MbSpaceItem & item ); bool SetEqual( const MbSpaceItem & item ); методы, возвращающие тип из перечисления геометрических объектов: .. code-block:: cpp MbeSpaceType IsA(); MbeSpaceType Type(); MbeSpaceType Family(); методы, обеспечивающие выдачу и редактирование внутренних данных объекта: .. code-block:: cpp MbProperty & CreateProperty( MbePrompt name ); void GetProperties( MbProperties & properties ); void SetProperties( MbProperties & properties ); метод, выполняющий построение полигональной копии геометрического объекта: .. code-block:: cpp void CalculateMesh( const MbStepData & stepData, const MbFormNote & note, MbMesh & mesh ) const; Все кривые, кроме :ref:`MbContour3D `, :ref:`MbContourOnSurface `, :ref:`MbContourOnPlane `, как правило, не имеют изломов. :ref:`MbContour3D `, :ref:`MbContourOnSurface `, :ref:`MbContourOnPlane ` представляют собой составные кривые и могут иметь изломы в точках сочленения составляющих их сегментов.