Files
Extern/C3d/Include/surf_section_surface.h
T
Dario Sassi e8f0fa2d27 Extern :
- C3d aggiornamento delle librerie.
2020-09-14 16:42:31 +00:00

474 lines
45 KiB
C++

////////////////////////////////////////////////////////////////////////////////
/**
\file
\brief \ru Поверхность заметания переменного сечения.
\en The swept mutable section surface. \~
*/
////////////////////////////////////////////////////////////////////////////////
#ifndef __SURF_SECTION_SURFACE_H
#define __SURF_SECTION_SURFACE_H
#include <surface.h>
#include <surf_spine.h>
#include <cur_surface_curve.h>
#include <cur_polycurve.h>
#include <function.h>
#include <mb_placement3d.h>
#include <mb_enum.h>
#include <tool_multithreading.h>
#include <templ_dptr.h>
#define _RO_MIN_ 0.05 // \ru Минимальный параметр переменного сечения. \en The minimum parameter of the swept section.
#define _CIRCLE_ 0.4142135623730950488016887242097 // \ru Параметр дуги окружности в сечении. \en The parameter is corresponding to the circle.
#define _PARABOLA_ 0.5 // \ru Параметр параболы в сечении. \en The parameter is corresponding to the parabola.
#define _RO_MAX_ 0.95 // \ru Максимальный параметр переменного сечения. \en The maximum parameter of the swept section.
class MATH_CLASS MbSurfaceWorkingData;
//------------------------------------------------------------------------------
/** \brief \ru Поверхность заметания переменного сечения.
\en The swept mutable section surface. \~
\details \ru Поверхность переменного (конического) сечения образуется путем движения плоской кривой, являющейся коническим сечением, вдоль опорной кривой.
В процессе движения форма плоской кривой меняется в соответствии с дискриминантом конического сечения.
Начало плоской кривой располагается на начальной направляющей кривой, а конец - на конечной направляющей кривой.
Плоскость переменного сечения сохраняет ортогональность опорной кривой в процессе движения.
Первый параметр поверхности совпадает с параметром опорной кривой.
Второй параметр поверхности совпадает с параметром плоской кривой.
\en The swept (conic) section surface is formed by moving the flat conic section curve along the reference curve.
In the process of movement, the shape of the flat curve changes in accordance with the discriminant of the conic section.
The beginning of the flat curve is located on the first guide curve and the end is located on the second guide curve.
The plane of the conic section preserves the orthogonality to the reference curve during movement.
First parameter of surface coincides with the parameter of reference curve.
Second parameter of surface coincides with the parameter of conic section curve. \~
\ingroup Surfaces
*/
// ---
class MATH_CLASS MbSectionSurface : public MbSurface {
public:
protected:
MbSpine * spine; ///< \ru Опорная кривая. \en The reference curve.
MbCurve3D * guide1; ///< \ru Первая направляющая кривая на первой поверхности (может быть NULL). \en The first guide curve on the first surface (may be NULL).
MbCurve3D * guide2; ///< \ru Вторая направляющая кривая на второй поверхности (может быть NULL). \en The second guide curve on the second surface (may be NULL).
std::vector<MbCurve3D *> curves; ///< \ru Дополнительные направляющие кривые (могут отсутствовать). \en The additional guide curves (may be empty).
MbFunction * function; ///< \ru Функция управления сечением (радиус или дискриминант, может быть NULL)). \en Section control function (radius or discriminant, may be NULL).
MbPolyCurve * pattern; ///< \ru Образующая кривая при form==cs_Shape (для других форм NULL). \en Forming curve for form==cs_Shape (NULL on other case).
std::vector<MbCartPoint> shape; ///< \ru Описание сечения при form==cs_Shape (пуст в других случаях). \en Description of shape cross-section for form==cs_Shape (is empty on other case).
std::vector<double> knots; ///< \ru Узловой вектор сплайна. \en Knot vector of the spline.
size_t order; ///< \ru Порядок сплайна (степень + 1). \en Order of spline (degree + 1).
MbeSectionShape form; ///< \ru Форма сечения поверхности при фиксированном втором параметре. \en The surface cross-section shape with the second parameter fixed.
double umin; ///< \ru Минимальное значение первого параметра u. \en Minimal value of parameter u.
double umax; ///< \ru Максимальное значение первого параметра u. \en Maximal value of parameter u.
double vmin; ///< \ru Минимальное значение второго параметра v. \en Minimal value of parameter v.
double vmax; ///< \ru Максимальное значение второго параметра v. \en Maximal value of parameter v.
bool uclosed; ///< \ru Признак замкнутости поверхности по параметру u. \en An attribute of closedness in u-parameter direction.
bool vclosed; ///< \ru Признак замкнутости поверхности по параметру v. \en An attribute of closedness in v-parameter direction.
bool poleVMin; ///< \ru Наличие полюса поверхности при vmin. \en Existence of a pole at vmin.
bool poleVMax; ///< \ru Наличие полюса поверхности при vmax. \en Existence of a pole at vmax.
//------------------------------------------------------------------------------
/// \ru Вспомогательные данные служат для ускорения работы объекта. \en Auxiliary data are used for fast calculations. \n \~
// ---
class MbSectionSurfaceAuxiliaryData : public AuxiliaryData {
public:
DPtr<MbSurfaceWorkingData> wData; ///< \ru Рабочие данные для расчета поверхности. \en Working data for the calculation of a surface.
MbPlacement3D wPlace; ///< \ru Плоскость XY локальной системы, перпендикулярная опорной кривой в текущей точке. \en The XY plane of local coordinate system perpendicular to the reference curve at its current points.
MbCartPoint wPnt0; ///< \ru Точка на плоскости от её пересечения с первой направляющей кривой. \en The point on plane of its intersection with first guide curve on surface.
MbCartPoint wPnt1; ///< \ru Точка на плоскости от её пересечения с первой направляющей кривой. \en The point on plane of its intersection with first guide curve on surface.
MbCartPoint wPnt2; ///< \ru Точка на плоскости от её пересечения со второй направляющей кривой. \en The point on plane of its intersection with second guide curve on surface.
MbVector wVec1; ///< \ru Вектор на плоскости от её пересечения с поверхностью первой направляющей. \en The vector on plane of its intersection with surface of first guide curve.
MbVector wVec2; ///< \ru Вектор на плоскости от её пересечения с поверхностью второй направляющей. \en The vector on plane of its intersection with surface of second guide curve.
double wPar0; ///< \ru Параметр первой направляющей кривой её пересечения с плоскости. \en The parameter of the first guide curve.
double wPar1; ///< \ru Параметр первой направляющей кривой её пересечения с плоскости. \en The parameter of the first guide curve.
double wPar2; ///< \ru Параметр второй направляющей кривой её пересечения с плоскости. \en The parameter of the second guide curve.
double wPar; ///< \ru Параметр v, для которого вычислена плоскость wPlace. \en The parameter v for which was calculated the plane wPlace.
MbVector3D wOrig1; ///< \ru Первая производная по v начала координат плоскости. \en The first derivative of the v origin of the wPlace.
MbVector3D wOrig2; ///< \ru Вторая производная по v начала координат плоскости. \en The second derivative of the v origin of the wPlace.
MbVector3D wDerv1; ///< \ru Первая производная по v оси axisX плоскости. \en The first derivative of the v axisX of wPlace.
MbVector3D wDerv2; ///< \ru Первая производная по v оси axisY плоскости. \en The first derivative of the v axisY of wPlace.
MbVector3D wSecn1; ///< \ru Вторая производная по v оси axisX плоскости. \en The second derivative of the v axisX of wPlace.
MbVector3D wSecn2; ///< \ru Вторая производная по v оси axisY плоскости. \en The second derivative of the v axisY of wPlace.
std::vector<double> wSplns; ///< \ru Рабочее множество В-сплайнов. \en The work set of B-splines.
std::vector<MbCartPoint> wxy; ///< \ru Рабочее множество точек. \en The work set of the points.
std::vector<MbVector> wxyV; ///< \ru Рабочее множество первых производных по V. \en The work set of the firsf derivatives.
std::vector<MbVector> wxyVV; ///< \ru Рабочее множество вторых производных по V. \en The work set of the second derivatives.
std::vector<MbVector> wxyVVV; ///< \ru Рабочее множество третьих производных по V. \en The work set of the third derivatives.
double wVal; ///< \ru Параметр v, для которого вычислены производные начала и орт плоскости wPlace. \en The parameter v for which was calculated the plane origin derivative and axises derivatives.
MbSectionSurfaceAuxiliaryData();
MbSectionSurfaceAuxiliaryData( const MbSectionSurfaceAuxiliaryData & );
virtual ~MbSectionSurfaceAuxiliaryData();
void Init(); // \ru Инициализация данных. \en Init data.
void Init( const MbSectionSurfaceAuxiliaryData & );
void Move( const MbVector3D & ); // \ru Сдвиг. \en Move.
};
mutable CacheManager<MbSectionSurfaceAuxiliaryData> cache;
protected:
/** \brief \ru Конструктор поверхности переменного сечения.
\en Swept mutable section surface constructor. \~
\details \ru Конструктор поверхности переменного сечения по опорной кривой и двум направляющим.
\en Swept section surface constructor by reference curve and guide curves. \~
\param[in] sp - \ru Опорная кривая.
\en The reference curve (spine). \~
\param[in] c1 - \ru Первая направляющая кривая.
\en The first guide curve. \~
\param[in] c2 - \ru Вторая направляющая кривая.
\en The second guide curve. \~
\param[in] cs - \ru Дополнительные направляющие кривые (могут отсутствовать).
\en The additional guide curves (may be empty). \~
\param[in] f - \ru Форма сечения поверхности.
\en The form of the surface section. \~
\param[in] uBeg - \ru Минимальное значение первого параметра поверхности.
\en The minimum value of the first surface parameter. \~
\param[in] uEnd - \ru Максимальное значение первого параметра поверхности.
\en The maximum value of the first surface parameter. \~
\param[in] func - \ru Функция управления сечением поверхности.
\en Section control function. \~
\param[in] patt - \ru Образующая кривая при form==cs_Shape.
\en Forming curve for form==cs_Shape. \~
\param[in] sh - \ru Описание сечения при form==cs_Shape (пуст в других случаях).
\en Description of shape cross-section for form==cs_Shape. \~
*/
MbSectionSurface( MbSpine & sp, MbCurve3D & c1, MbCurve3D & c2,
std::vector<MbCurve3D *> cs, MbeSectionShape f,
double uBeg, double uEnd, MbFunction * func,
MbPolyCurve * patt, std::vector<MbCartPoint> & sh );
/** \brief \ru Конструктор поверхности переменного сечения.
\en Swept mutable section surface constructor. \~
\details \ru Конструктор поверхности переменного сечения по осевой кривой и закону изменения радиуса вращения.
\en Swept mutable section surface constructor with axis curve and radius law. \~
\param[in] sp - \ru Опорная кривая.
\en The reference curve (spine). \~
\param[in] c0 - \ru Осевая кривая.
\en The axis curve. \~
\param[in] f - \ru Форма сечения поверхности (cs_Round).
\en The form of the surface section (cs_Round). \~
\param[in] uBeg - \ru Минимальное значение первого параметра поверхности (uBeg<uEnd).
\en The minimum value of the first surface parameter (uBeg<uEnd). \~
\param[in] uEnd - \ru Максимальное значение первого параметра поверхности (0<uEnd<M_IP2).
\en The maximum value of the first surface parameter (0<uEnd<M_IP2). \~
\param[in] func - \ru Функция именения радиуса сечения поверхности.
\en Section radius function. \~
*/
MbSectionSurface( MbSpine & sp, MbCurve3D & c0, MbeSectionShape f, double uBeg, double uEnd, MbFunction & func );
protected:
// \ru Конструктор-копия. \en Copy constructor.
MbSectionSurface( const MbSectionSurface &, MbRegDuplicate * );
private:
MbSectionSurface( const MbSectionSurface & ); // \ru Не реализовано. \en Not implemented.
public:
// \ru Деструктор. \en The destructor.
virtual ~MbSectionSurface();
public:
VISITING_CLASS( MbSectionSurface );
/** \brief \ru Создание поверхности заметания переменного сечения.
\en Swept mutable section surface creation. \~
\details \ru Создание поверхности заметания переменного сечения по опорной кривой и двум направляющим.
\en Swept section surface creation by reference curve and guide curves. \~
\param[in] rc - \ru Опорная кривая.
\en The reference curve (spine). \~
\param[in] g1 - \ru Первая направляющая кривая.
\en The first guide curve. \~
\param[in] g2 - \ru Вторая направляющая кривая (g1==g2 совпадает с первой при cs_Round).
\en The second guide curve (g1==g2 the same first guide for st_Round). \~
\param[in] c0 - \ru Дополнительная направляющая кривая (может быть NULL).
\en The additional guide curve (may be NULL). \~
\param[in] f - \ru Форма сечения поверхности.
\en The form of the surface section. \~
\param[in] sense - \ru Направление нормали поверхности направляющей кривой (для guide1==guide2).
\en The normal direction of guide curve surface (for guide1==guide2). \~
\param[in] uBeg - \ru Минимальное значение первого параметра поверхности.
\en The minimum value of the first surface parameter. \~
\param[in] uEnd - \ru Максимальное значение первого параметра поверхности.
\en The maximum value of the first surface parameter. \~
\param[in] func - \ru Функция управления сечением поверхности.
\en Section control function. \~
\param[in] patt - \ru Образующая кривая при form==cs_Shape.
\en Forming curve for form==cs_Shape. \~
\param[in] buildSag - \ru Угловое отклонение при движении по кривым и поверхностям.
\en Angular deviation while moving along curves and surfaces. \~
\param[in] accuracy - \ru Точность построения.
\en The accuracy of building. \~
\param[in] vers - \ru Версия поверхности.
\en The surface version. \~
\param[out] resType - \ru Код ошибки порстроения.
\en Result code of building. \~
\result \ru Возвращает построенную поверхностьь.
\en Returns the constructed surface. \~
*/
static MbSectionSurface * Create( const MbCurve3D & rc,
const MbCurve3D & g1, const MbCurve3D & g2,
const MbCurve3D * c0,
MbeSectionShape f,
bool sense,
double uBeg, double uEnd,
MbFunction * func,
MbCurve * patt,
double buildSag,
double accuracy,
VERSION vers,
MbResultType & resType );
/** \ru \name Общие функции геометрического объекта
\en \name Common functions of a geometric object
\{ */
virtual MbeSpaceType IsA() const; // \ru Тип элемента \en A type of element
virtual MbSpaceItem & Duplicate( MbRegDuplicate * = NULL ) const; // \ru Сделать копию элемента. \en Create a copy of the element.
virtual bool IsSame ( const MbSpaceItem & other, double accuracy = LENGTH_EPSILON ) const; // \ru Равны ли объекты. \en Whether the objects are equal.
virtual bool SetEqual ( const MbSpaceItem & ); // \ru Сделать равным. \en Make equal.
virtual bool IsSimilar ( const MbSpaceItem & ) const; // \ru Являются ли объекты подобными. \en Determine whether the objects are similar.
virtual void Transform( const MbMatrix3D &, MbRegTransform * = NULL ); // \ru Преобразовать элемент согласно матрице. \en Transform element according to the matrix.
virtual void Move ( const MbVector3D &, MbRegTransform * = NULL ); // \ru Сдвиг. \en Move.
virtual void Rotate ( const MbAxis3D &, double angle, MbRegTransform * = NULL ); // \ru Повернуть вокруг оси. \en Rotate around an axis.
virtual void GetProperties( MbProperties & ); // \ru Выдать свойства объекта. \en Get properties of the object.
virtual void SetProperties( const MbProperties & ); // \ru Записать свойства объекта. \en Set properties of the object.
virtual void GetBasisItems ( RPArray <MbSpaceItem> & ); // \ru Дать базовые объекты. \en Get the base objects.
virtual void GetBasisPoints( MbControlData3D & ) const; // \ru Выдать контрольные точки объекта. \en Get control points of object.
virtual void SetBasisPoints( const MbControlData3D & ); // \ru Изменить объект по контрольным точкам. \en Change the object by control points.
/** \} */
/** \ru \name Функции описания области определения поверхности
\en \name Functions for surface domain description
\{ */
virtual double GetUMin() const; // \ru Вернуть минимальное значение параметра u. \en Get the minimum value of u.
virtual double GetVMin() const; // \ru Вернуть минимальное значение параметра v. \en Get the minimum value of v.
virtual double GetUMax() const; // \ru Вернуть максимальное значение параметра u. \en Get the maximum value of u.
virtual double GetVMax() const; // \ru Вернуть максимальное значение параметра v. \en Get the maximum value of v.
virtual bool IsUClosed() const; // \ru Проверка замкнутости по параметру u. \en Check of surface closedness in u direction.
virtual bool IsVClosed() const; // \ru Проверка замкнутости по параметру v. \en Check of surface closedness in v direction.
/** \} */
/** \ru \name Функции для работы в области определения поверхности
Функции PointOn, Derive... поверхностей корректируют параметры
при выходе их за пределы прямоугольной области определения параметров.\n
\en \name Functions for working at surface domain
Functions PointOn, Derive... of surfaces correct parameters
when they are out of bounds of rectangular domain of parameters.\n
\{ */
virtual void PointOn ( double & u, double & v, MbCartPoint3D & ) const; // \ru Точка на поверхности. \en The point on the surface.
virtual void DeriveU ( double & u, double & v, MbVector3D & ) const; // \ru Первая производная по u. \en The first derivative with respect to u.
virtual void DeriveV ( double & u, double & v, MbVector3D & ) const; // \ru Первая производная по v. \en The first derivative with respect to v.
virtual void DeriveUU ( double & u, double & v, MbVector3D & ) const; // \ru Вторая производная по u. \en The second derivative with respect to u.
virtual void DeriveVV ( double & u, double & v, MbVector3D & ) const; // \ru Вторая производная по v. \en The second derivative with respect to v.
virtual void DeriveUV ( double & u, double & v, MbVector3D & ) const; // \ru Вторая производная по uv. \en The second derivative with respect to uv.
virtual void DeriveUUU( double & u, double & v, MbVector3D & ) const;
virtual void DeriveUUV( double & u, double & v, MbVector3D & ) const;
virtual void DeriveUVV( double & u, double & v, MbVector3D & ) const;
virtual void DeriveVVV( double & u, double & v, MbVector3D & ) const;
/** \} */
/** \ru \name Функции для работы внутри и вне области определения поверхности
функции _PointOn, _Derive... поверхностей не корректируют
параметры при выходе их за пределы прямоугольной области определения параметров.
\en \name Functions for working inside and outside the surface's domain
functions _PointOn, _Derive... of surfaces don't correct
parameters when they are out of bounds of rectangular domain of parameters.
\{ */
virtual void _PointOn ( double u, double v, MbCartPoint3D & ) const; // \ru Точка на расширенной поверхности. \en The point on the extended surface.
virtual void _DeriveU ( double u, double v, MbVector3D & ) const; // \ru Первая производная по u. \en The first derivative with respect to u.
virtual void _DeriveV ( double u, double v, MbVector3D & ) const; // \ru Первая производная по v. \en The first derivative with respect to v.
virtual void _DeriveUU ( double u, double v, MbVector3D & ) const; // \ru Вторая производная по u. \en The second derivative with respect to u.
virtual void _DeriveVV ( double u, double v, MbVector3D & ) const; // \ru Вторая производная по v. \en The second derivative with respect to v.
virtual void _DeriveUV ( double u, double v, MbVector3D & ) const; // \ru Вторая производная по uv. \en The second derivative with respect to uv.
virtual void _DeriveUUU( double u, double v, MbVector3D & ) const;
virtual void _DeriveUUV( double u, double v, MbVector3D & ) const;
virtual void _DeriveUVV( double u, double v, MbVector3D & ) const;
virtual void _DeriveVVV( double u, double v, MbVector3D & ) const;
// \ru Функции доступа к группе данных для работы внутри и вне области определения параметров поверхности.
// \en Functions for get of the group of data inside and outside the surface's domain of parameters.
virtual void Explore( double & u, double & v, bool ext,
MbCartPoint3D & pnt, MbVector3D & uDer, MbVector3D & vDer,
MbVector3D * uuDer, MbVector3D * vvDer, MbVector3D * uvDer, MbVector3D * nor ) const;
/** \} */
/** \ru \name Функции движения по поверхности
\en \name Functions of moving along the surface
\{ */
virtual double StepU ( double u, double v, double sag ) const; // \ru Вычисление шага по u по заданной стрелке прогиба. \en Calculation of the parameter step in u direction by the sag.
virtual double StepV ( double u, double v, double sag ) const; // \ru Вычисление шага по v по заданной стрелке прогиба. \en Calculation of the parameter step in v direction by the sag.
virtual double DeviationStepU( double u, double v, double angle ) const; // \ru Вычисление шага по u по заданному углу отклонения. \en Calculation of the parameter step in u direction by the deviation angle.
virtual double DeviationStepV( double u, double v, double angle ) const; // \ru Вычисление шага по v по заданному углу отклонения. \en Calculation of the parameter step in v direction by the deviation angle.
virtual double MetricStepU ( double u, double v, double length ) const; // \ru Вычисление шага по u по заданной длине. \en Calculation of the parameter step in u direction by the given length.
virtual double MetricStepV ( double u, double v, double length ) const; // \ru Вычисление шага по v по заданной длине. \en Calculation of the parameter step in v direction by the given length.
virtual size_t GetUCount() const;
virtual size_t GetVCount() const;
virtual bool GetPoleVMin() const; // \ru Существует ли полюс на границе параметрической области. \en Whether a pole exists on parametric region boundary.
virtual bool GetPoleVMax() const; // \ru Существует ли полюс на границе параметрической области. \en Whether a pole exists on parametric region boundary.
virtual bool IsPole( double u, double v ) const; // \ru Является ли точка полюсом. \en Whether the point is a pole.
/** \} */
/** \ru \name Общие функции поверхности
\en \name Common functions of surface
\{ */
virtual double CurvatureU ( double u, double v ) const; // \ru Kривизна линии по u. \en Curvature of line by u.
virtual bool IsPlanar() const; // \ru Является ли поверхность плоской. \en Whether the surface is planar.
virtual void ChangeCarrier( const MbSpaceItem & item, MbSpaceItem & init ); // \ru Изменение носителя. \en Changing of carrier.
virtual void CalculateGabarit( MbCube & ) const; // \ru Выдать габарит. \en Get the bounding box.
virtual void CalculateLocalGabarit( const MbMatrix3D &, MbCube & ) const; // \ru Рассчитать габарит относительно л.с.к. \en Calculate bounding box relative to the local coordinate system.
virtual MbSplineSurface * NurbsSurface( double, double, double, double, bool bmatch = false ) const; // \ru NURBS копия поверхности. \en NURBS copy of a surface.
virtual MbSurface * NurbsSurface( const MbNurbsParameters & uParam, const MbNurbsParameters & vParam ) const; // \ru NURBS копия поверхности. \en NURBS copy of a surface.
virtual MbSurface * Offset( double d, bool same ) const; // \ru Создание эквидистантной поверхности. \en Create an offset surface.
// \ru Подобные ли поверхности для объединения (слива) \en Whether the surfaces to union (joining) are similar
//virtual bool IsSpecialSimilarToSurface( const MbSurface & surf, VERSION version, double precision = METRIC_PRECISION ) const; // \ru Специальный случай \en Special case
virtual MbCurve3D * CurveU( double v, MbRect1D *pRgn, bool bApprox = true ) const; // \ru Пространственная копия линии v = const. \en Spatial copy of 'v = const'-line.
virtual MbCurve3D * CurveV( double u, MbRect1D *pRgn, bool bApprox = true ) const; // \ru Пространственная копия линии u = const. \en Spatial copy of 'u = const'-line.
// \ru Построить касательные и нормальные плейсменты конструктивных плоскостей. \en Construct tangent and normal placements of constructive planes.
virtual bool CreateNormalPlacements ( const MbVector3D & axisZ, double angle, SArray<MbPlacement3D> & places ) const;
virtual bool CreateTangentPlacements( const MbVector3D & axisZ, SArray<MbPlacement3D> & places ) const;
// \ru Подобные ли поверхности для объединения (слива). \en Whether the surfaces to union (joining) are similar.
virtual bool IsSimilarToSurface( const MbSurface & surf, VERSION version, double precision = METRIC_PRECISION ) const;
// \ru Дать двумерную матрицу преобразования из своей параметрической области в параметрическую область surf. \en Get two-dimensional transformation matrix from own parametric region to parametric region of 'surf'.
virtual bool GetMatrixToSurface( const MbSurface & surf, MbMatrix & matr, VERSION version, double precision = METRIC_PRECISION ) const;
/// \ru Определить, выпуклая ли поверхность. \en Determine whether the surface is convex.
virtual ThreeStates Salient() const;
// \ru Определение разбивки параметрической области поверхности вертикалями и горизонталями. \en Determine splitting of parametric region of surface by vertical and horizontal lines.
virtual void GetTesselation( const MbStepData & stepData,
double u1, double u2, double v1, double v2,
SArray<double> & uu, SArray<double> & vv ) const;
//virtual bool IsSpinePeriodic() const; // \ru Периодичность направляющей. \en Periodicity of a reference curve.
virtual size_t GetUMeshCount() const; // \ru Выдать количество полигонов по u. \en Get the count of polygons by u.
virtual size_t GetVMeshCount() const; // \ru Выдать количество полигонов по v. \en Get the count of polygons by v.
/** \} */
/** \ru \name Функции поверхности заметания переменного сечения.
\en \name Functions of the swept mutable section surface.
\{ */
/// \ru Направляющая. \en Guide curve.
const MbSpine & GetSpine() const { return *spine; }
/// \ru Направляющая кривая. \en The spine (reference) curve.
const MbCurve3D & GetSpineCurve() const { return spine->GetCurve(); }
/// \ru Первая направляющая кривая на первой поверхности (может быть NULL). \en The first guide curve on the first surface (may be NULL).
const MbCurve3D * GetGuide1() const { return guide1; }
/// \ru Вторая направляющая кривая на второй поверхности (может быть NULL). \en The second guide curve on the second surface (may be NULL).
const MbCurve3D * GetGuide2() const { return guide2; }
/// \ru Дополнительные направляющие кривые (могут отсутствовать). \en The additional guide curves (may be empty).
const MbCurve3D * GetCurve( size_t i ) const { return ( i < curves.size() ) ? curves[i] : NULL; }
/// \ru Функция управления сечением (радиус или дискриминант, может быть NULL)). \en Section control function (radius or discriminant, may be NULL).
const MbFunction * GetFunction() const { return function; }
/// \ru Образующая кривая при form==cs_Shape (для других форм NULL). \en Forming curve for form==cs_Shape (NULL on other case).
const MbPolyCurve * GetPattern() const { return pattern; }
/// \ru Вычисление параметров направляющих кривых по второму параметру поверхности. \en Calculating the parameters of guide curves by the second surface parameter.
bool GuideParams( double v, double & t1, double & t2 ) const;
/// \ru Вычисление параметра вершинной кривой по второму параметру поверхности. \en Calculating the parameter of apex curve by the second surface parameter.
bool ApexParam( double v, double & t0 ) const;
/// \ru Вычисление точки поверхности по параметру направляющей кривой. \en Calculating the surface point by the parameter of first the guide curves.
bool ParamByGuide1( double t1, MbCartPoint & p ) const;
/// \ru Вычисление точки поверхности по параметру направляющей кривой. \en Calculating the surface point by the parameter of the second guide curves.
bool ParamByGuide2( double t2, MbCartPoint & p ) const;
/// \ru Вычисление второго параметра поверхности по параметру вершинной кривой. \en Calculating the second surface parameter by the parameter of the apex curve.
bool ParamByApex( double t0, double & v ) const;
/// \ru Вычисление точек поверхности по параметрам первой направляющей кривой. \en Calculating surface points by the first guide curve.
bool PointsByGuide1( std::vector<MbCartPoint> & points ) const;
/// \ru Вычисление точек поверхности по параметрам второй направляющей кривой. \en Calculating surface points by the second guide curve.
bool PointsByGuide2( std::vector<MbCartPoint> & points ) const;
/** \} */
protected :
void Init(); // \ru Инициализация данных. \en Data init.
void CacheInit(); // \ru Инициализация вспомогательных данных. \en Auxiliary data init.
// \ru Проверить и изменить при необходимости параметры поверхности. \en Check and correct parameters of the surface.
void CheckParams( double & u, double & v, bool ext ) const;
// \ru Вычисление пересечений направляющих с плоскостью сечения поверхности. \ en Calculating the intersections of guides with the surface cross -section plane.
bool SectionData( const MbCurve3D * curve0, const double & v, MbPlacement3D & place,
MbCartPoint & xy0, double & t0,
MbCartPoint & xy1, MbVector & vec1, double & t1,
MbCartPoint & xy2, MbVector & vec2, double & t2 ) const;
// \ru Расчет двумерных точек и их производных на плоском сечении поверхности. \en Calculation of two-dimension points and their derivatives on the surface plane section.
void Round( const double & u, const double & v,
const MbCartPoint & xy1, const MbVector & xy1V, const MbVector & xy1VV, const MbVector & xy1VVV,
const MbCartPoint & xy0, const MbVector & xy0V, const MbVector & xy0VV, const MbVector & xy0VVV,
MbCartPoint & p, MbVector & pU, MbVector & pV, MbVector * pUU, MbVector * pUV, MbVector * pVV,
MbVector * pUUU, MbVector * pUUV, MbVector * pUVV, MbVector * pVVV ) const;
void Linea( const double & u,
const MbCartPoint & xy1, const MbVector & xy1V, const MbVector & xy1VV, const MbVector & xy1VVV,
const MbCartPoint & xy2, const MbVector & xy2V, const MbVector & xy2VV, const MbVector & xy2VVV,
MbCartPoint & p, MbVector & pU, MbVector & pV, MbVector * pUU, MbVector * pUV, MbVector * pVV,
MbVector * pUUU, MbVector * pUUV, MbVector * pUVV, MbVector * pVVV ) const;
void Conic( const double & u, const double & v,
const MbCartPoint & xy1, const MbVector & xy1V, const MbVector & xy1VV, const MbVector & xy1VVV,
const MbCartPoint & xy2, const MbVector & xy2V, const MbVector & xy2VV, const MbVector & xy2VVV,
const MbCartPoint & xy0, const MbVector & xy0V, const MbVector & xy0VV, const MbVector & xy0VVV,
MbCartPoint & p, MbVector & pU, MbVector & pV, MbVector * pUU, MbVector * pUV, MbVector * pVV,
MbVector * pUUU, MbVector * pUUV, MbVector * pUVV, MbVector * pVVV ) const;
void Cubic( const double & u, const double & v, std::vector<double> & bSplines,
const std::vector<MbCartPoint> & xy, const std::vector<MbVector> & xyV,
const std::vector<MbVector> & xyVV, const std::vector<MbVector> & xyVVV,
MbCartPoint & p, MbVector & pU, MbVector & pV, MbVector * pUU, MbVector * pUV, MbVector * pVV,
MbVector * pUUU, MbVector * pUUV, MbVector * pUVV, MbVector * pVVV ) const;
void Shape( const double & u, const double & v,
const MbCartPoint & xy1, const MbVector & xy1V, const MbVector & xy1VV, const MbVector & xy1VVV,
const MbCartPoint & xy2, const MbVector & xy2V, const MbVector & xy2VV, const MbVector & xy2VVV,
const MbCartPoint & xy0, const MbVector & xy0V, const MbVector & xy0VV, const MbVector & xy0VVV,
MbCartPoint & p, MbVector & pU, MbVector & pV, MbVector * pUU, MbVector * pUV, MbVector * pVV,
MbVector * pUUU, MbVector * pUUV, MbVector * pUVV, MbVector * pVVV ) const;
ptrdiff_t B_Splanes( double & u, std::vector<double> & bSplanes ) const; // \ru Вычисление B-сплайнов.\en B_splines calculation.
// \ru Вычисление радиуса-вектора точки его производных поверхности. \en The surface radius-vector and it derivatives calculation.
void Section ( const double & u, const double & v, MbCartPoint3D & pnt,
MbVector3D * uDer, MbVector3D * vDer,
MbVector3D * uuDer, MbVector3D * uvDer, MbVector3D * vvDer,
MbVector3D * uuuDer, MbVector3D * uuvDer, MbVector3D * uvvDer, MbVector3D * vvvDer ) const;
void PointOn ( double & v, double & u, bool ext, MbCartPoint3D & p ) const; // \ru Вычисления точки поверхности. \en Calculate surface point.
void DeriveU ( double & u, double & v, bool ext, MbVector3D & ) const; // \ru Первая производная по u. \en The first derivative with respect to u.
void DeriveV ( double & u, double & v, bool ext, MbVector3D & ) const; // \ru Первая производная по v. \en The first derivative with respect to v.
void DeriveUU ( double & u, double & v, bool ext, MbVector3D & ) const; // \ru Вторая производная по u. \en The second derivative with respect to u.
void DeriveUV ( double & u, double & v, bool ext, MbVector3D & ) const; // \ru Вторая производная по uv. \en The second derivative with respect to uv.
void DeriveVV ( double & u, double & v, bool ext, MbVector3D & ) const; // \ru Вторая производная по v. \en The second derivative with respect to v.
void DeriveUUU( double & u, double & v, bool ext, MbVector3D & ) const; // \ru Третья производная по uuu. \en The third derivative with respect to uuu.
void DeriveUUV( double & u, double & v, bool ext, MbVector3D & ) const; // \ru Третья производная по uuv. \en The third derivative with respect to uuv.
void DeriveUVV( double & u, double & v, bool ext, MbVector3D & ) const; // \ru Третья производная по uvv. \en The third derivative with respect to uvv.
void DeriveVVV( double & u, double & v, bool ext, MbVector3D & ) const; // \ru Третья производная по vvv. \en The third derivative with respect to vvv.
// \ru Вычисление точек для создания NURBS копии кривых поверхности. \en Points calculation for NURBS copy surface.
bool CollectNurbsPoints( double vin, double vax, size_t pCount, double angle,
SArray<double> & params,
SArray<MbCartPoint3D> & points1,
SArray<MbCartPoint3D> & points2,
SArray<MbCartPoint3D> & points_0,
SArray<MbCartPoint3D> & points_1,
SArray<MbCartPoint3D> & points_2,
SArray<MbCartPoint3D> & points_3,
SArray<MbCartPoint3D> & points_4 ) const;
private:
void operator = ( const MbSectionSurface & ); // \ru Не реализовано. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL( MbSectionSurface )
};
IMPL_PERSISTENT_OPS( MbSectionSurface )
#endif // __SURF_SECTION_SURFACE_H