Files
Extern/C3d/Include/surf_evolution_surface.h
SaraP 3df46e611e Extern :
- C3d aggiornamento delle librerie ( 117948).
2023-05-11 10:00:28 +02:00

367 lines
28 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
////////////////////////////////////////////////////////////////////////////////
/**
\file
\brief \ru Поверхность заметания.
\en The swept surface. \~
*/
////////////////////////////////////////////////////////////////////////////////
#ifndef __SURF_EVOLUTION_SURFACE_H
#define __SURF_EVOLUTION_SURFACE_H
#include <surf_swept_surface.h>
#include <surf_spine.h>
#include <tool_multithreading.h>
#include <templ_dptr.h>
class MATH_CLASS MbSurfaceWorkingData;
//------------------------------------------------------------------------------
/** \brief \ru Поверхность заметания.
\en The swept surface. \~
\details \ru Кинематическая поверхность образуется путем движения образующей кривой curve по направляющей кривой spine->curve.
В процессе движения вдоль направляющей кривой образующая кривая сохраняет своё положение в движущейся локальной системе координат,
начало которой совпадает с текущей точкой базовой кривой.
Одна из осей движущейся локальной системы координат всегда совпадает с касательной направляющей кривой,
а две другие оси ортогональны ей.
Первый параметр поверхности совпадает с параметром образующей кривой.
Второй параметр поверхности совпадает с параметром направляющей кривой.
\en Sweep with guide curve surface is formed by moving the 'curve' generating curve along spine->curve guide curve.
While moving along a guide curve the generating curve keeps its position in the moving local coordinate system,
which origin coincides with the current point of the base curve.
One of the axes of the moving local coordinate system is always coincident to the tangent of the guide curve,
and the other two axes are orthogonal to it.
First parameter of surface coincides with parameter of generating curve.
Second parameter of surface coincides with parameter of guide curve. \~
\ingroup Surfaces
*/
// ---
class MATH_CLASS MbEvolutionSurface : public MbSweptSurface {
protected:
MbSpine * spine; ///< \ru Направляющая кривая. \en Spine (guide) curve.
MbCartPoint3D origin; ///< \ru Начало направляющей кривой. \en Beginning of generating curve.
//------------------------------------------------------------------------------
/** \brief \ru Вспомогательные данные.
\en Auxiliary data. \~
\details \ru Вспомогательные данные служат для ускорения работы объекта.
\en Auxiliary data are used for fast calculations. \n \~
*/
// ---
class MbEvolutionSurfaceAuxiliaryData : public AuxiliaryData {
public:
DPtr<MbSurfaceWorkingData> wData; ///< \ru Рабочие данные для расчета поверхности. \en Working data for the calculation of a surface.
MbCartPoint3D wPnt; ///< \ru Рабочая точка. \en Working point.
MbVector3D wVect; ///< \ru Рабочий вектор. \en Working vector.
MbMatrix3D wMatr; ///< \ru Рабочая матрица. \en Working matrix.
MbEvolutionSurfaceAuxiliaryData();
MbEvolutionSurfaceAuxiliaryData( const MbEvolutionSurfaceAuxiliaryData & );
virtual ~MbEvolutionSurfaceAuxiliaryData();
void Init();
void Init( const MbEvolutionSurfaceAuxiliaryData & );
void Move( const MbVector3D & );
};
mutable CacheManager<MbEvolutionSurfaceAuxiliaryData> cache;
public:
/** \brief \ru Конструктор по образующей и направляющей.
\en Constructor by generating curve and guide curve. \~
\details \ru Конструктор по образующей и направляющей.
\en Constructor by generating curve and guide curve. \~
\param[in] c - \ru Образующая
\en Generating curve \~
\param[in] s - \ru Направляющая
\en Guide curve \~
\param[in] sameCurve - \ru Признак использования оригинала образующей, а не копии
\en Attribute of usage of original of generating curve, not a copy \~
\param[in] sameSpine - \ru Признак использования оригинала направляющей, а не копии
\en Attribute of usage of original of guide curve, not a copy \~
*/
MbEvolutionSurface( const MbCurve3D & c, const MbSpine & s, bool sameCurve, bool sameSpine = false );
/** \brief \ru Конструктор по образующей и направляющей.
\en Constructor by generating curve and guide curve. \~
\details \ru Конструктор по образующей, направляющей и её кривой векторa ориентации матрицы преобразования.
\en Constructor by generating curve, guide curve and its curve of transformation matrix orientation vector. \~
\param[in] c - \ru Образующая
\en Generating curve \~
\param[in] s - \ru Направляющая
\en Guide curve \~
\param[in] d - \ru Кривая векторa ориентации матрицы преобразования направляющей
\en Curve of orientation vector of transformation matrix of guide curve \~
\param[in] sameCurve - \ru Признак использования оригинала образующей, а не копии
\en Attribute of usage of original of generating curve, not a copy \~
\param[in] sameSpine - \ru Признак использования оригинала направляющей, а не копии
\en Attribute of usage of original of guide curve, not a copy \~
\param[in] sameD - \ru Признак использования оригинала кривой d, а не копии
\en Attribute of usage of original of 'd' curve, not a copy \~
*/
MbEvolutionSurface( const MbCurve3D & c, const MbCurve3D & s, const MbCurve3D & d,
bool sameCurve, bool sameSpine, bool sameD );
/** \brief \ru Конструктор по радиусу, направляющей и её кривой векторa ориентации матрицы преобразования.
\en Constructor by radius, guide curve and its curve of transformation matrix orientation vector. \~
\details \ru Конструктор кинематической поверхности с образующей кривой - дугой окружности.
Используется только в конвертерах.
\en Constructor of evolution surface with circular arc as generating curve.
Used only in converters. \~
\param[in] r - \ru Радиус образующей
\en Radius of generating curve \~
\param[in] s - \ru Направляющая
\en Guide curve \~
\param[in] d - \ru Кривая векторa ориентации матрицы преобразования направляющей
\en Curve of orientation vector of transformation matrix of guide curve \~
\param[in] pURgn - \ru Область параметра U
\en Region of U parameter \~
\param[in] pVRgn - \ru Область параметра V
\en Region of V parameter \~
*/
MbEvolutionSurface( double r, const MbCurve3D & s, const MbCurve3D & d, MbRect1D * pURgn, MbRect1D * pVRgn, VERSION version = Math::DefaultMathVersion() );
protected:
MbEvolutionSurface( const MbEvolutionSurface &, MbRegDuplicate * );
private:
MbEvolutionSurface( const MbEvolutionSurface & ); // \ru Не реализовано. \en Not implemented.
public:
virtual ~MbEvolutionSurface();
public:
VISITING_CLASS( MbEvolutionSurface );
/** \ru \name Общие функции геометрического объекта
\en \name Common functions of a geometric object
\{ */
MbeSpaceType IsA() const override; // \ru Тип элемента \en A type of element
MbSpaceItem & Duplicate( MbRegDuplicate * = nullptr ) const override; // \ru Сделать копию элемента. \en Create a copy of the element.
bool IsSame ( const MbSpaceItem & other, double accuracy = LENGTH_EPSILON ) const override; // \ru Равны ли объекты. \en Whether the objects are equal.
bool SetEqual ( const MbSpaceItem & ) override; // \ru Сделать равным. \en Make equal.
bool IsSimilar ( const MbSpaceItem & ) const override; // \ru Являются ли объекты подобными. \en Determine whether the objects are similar.
void Transform( const MbMatrix3D &, MbRegTransform * = nullptr ) override; // \ru Преобразовать элемент согласно матрице. \en Transform element according to the matrix.
void Move ( const MbVector3D &, MbRegTransform * = nullptr ) override; // \ru Сдвиг. \en Move.
void Rotate ( const MbAxis3D &, double angle, MbRegTransform * = nullptr ) override; // \ru Повернуть вокруг оси. \en Rotate around an axis.
void GetProperties( MbProperties & ) override; // \ru Выдать свойства объекта. \en Get properties of the object.
void SetProperties( const MbProperties & ) override; // \ru Записать свойства объекта. \en Set properties of the object.
void GetBasisItems ( RPArray <MbSpaceItem> & ) override; // \ru Дать базовые объекты. \en Get the base objects.
void GetBasisPoints( MbControlData3D & ) const override; // \ru Выдать контрольные точки объекта. \en Get control points of object.
void SetBasisPoints( const MbControlData3D & ) override; // \ru Изменить объект по контрольным точкам. \en Change the object by control points.
/** \} */
/** \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
\{ */
void PointOn ( double & u, double & v, MbCartPoint3D & ) const override; // \ru Точка на поверхности. \en The point on the surface.
void DeriveU ( double & u, double & v, MbVector3D & ) const override; // \ru Первая производная по u. \en The first derivative with respect to u.
void DeriveV ( double & u, double & v, MbVector3D & ) const override; // \ru Первая производная по v. \en The first derivative with respect to v.
void DeriveUU ( double & u, double & v, MbVector3D & ) const override; // \ru Вторая производная по u. \en The second derivative with respect to u.
void DeriveVV ( double & u, double & v, MbVector3D & ) const override; // \ru Вторая производная по v. \en The second derivative with respect to v.
void DeriveUV ( double & u, double & v, MbVector3D & ) const override; // \ru Вторая производная по uv. \en The second derivative with respect to uv.
void DeriveUUU( double & u, double & v, MbVector3D & ) const override;
void DeriveUUV( double & u, double & v, MbVector3D & ) const override;
void DeriveUVV( double & u, double & v, MbVector3D & ) const override;
void DeriveVVV( double & u, double & v, MbVector3D & ) const override;
void Normal( double & u, double & v, MbVector3D & ) const override;
/** \} */
/** \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.
\{ */
void _PointOn ( double u, double v, MbCartPoint3D & ) const override; // \ru Точка на расширенной поверхности. \en The point on the extended surface.
void _DeriveU ( double u, double v, MbVector3D & ) const override; // \ru Первая производная по u. \en The first derivative with respect to u.
void _DeriveV ( double u, double v, MbVector3D & ) const override; // \ru Первая производная по v. \en The first derivative with respect to v.
void _DeriveUU ( double u, double v, MbVector3D & ) const override; // \ru Вторая производная по u. \en The second derivative with respect to u.
void _DeriveVV ( double u, double v, MbVector3D & ) const override; // \ru Вторая производная по v. \en The second derivative with respect to v.
void _DeriveUV ( double u, double v, MbVector3D & ) const override; // \ru Вторая производная по uv. \en The second derivative with respect to uv.
void _DeriveUUU( double u, double v, MbVector3D & ) const override;
void _DeriveUUV( double u, double v, MbVector3D & ) const override;
void _DeriveUVV( double u, double v, MbVector3D & ) const override;
void _DeriveVVV( double u, double v, MbVector3D & ) const override;
void _Normal( double u, double v, MbVector3D & ) const override;
/** \} */
/** \ru \name Функции доступа к группе данных для работы внутри и вне области определения параметров поверхности.
\en \name Functions for get of the group of data inside and outside the surface's domain of parameters.
\{ */
void Explore( double & u, double & v, bool ext,
MbCartPoint3D & pnt, MbVector3D & uDer, MbVector3D & vDer,
MbVector3D * uuDer, MbVector3D * vvDer, MbVector3D * uvDer, MbVector3D * nor ) const override;
/** \} */
/** \ru \name Функции движения по поверхности
\en \name Functions of moving along the surface
\{ */
double StepU ( double u, double v, double sag ) const override; // \ru Вычисление шага по u по заданной стрелке прогиба. \en Calculation of the parameter step in u direction by the sag.
double StepV ( double u, double v, double sag ) const override; // \ru Вычисление шага по v по заданной стрелке прогиба. \en Calculation of the parameter step in v direction by the sag.
double DeviationStepU( double u, double v, double angle ) const override; // \ru Вычисление шага по u по заданному углу отклонения. \en Calculation of the parameter step in u direction by the deviation angle.
double DeviationStepV( double u, double v, double angle ) const override; // \ru Вычисление шага по v по заданному углу отклонения. \en Calculation of the parameter step in v direction by the deviation angle.
double MetricStepU ( double u, double v, double length ) const override; // \ru Вычисление шага по u по заданной длине. \en Calculation of the parameter step in u direction by the given length.
double MetricStepV ( double u, double v, double length ) const override; // \ru Вычисление шага по v по заданной длине. \en Calculation of the parameter step in v direction by the given length.
size_t GetUCount() const override;
size_t GetVCount() const override;
/** \} */
/** \ru \name Общие функции поверхности
\en \name Common functions of surface
\{ */
double CurvatureU ( double u, double v ) const override; // \ru Kривизна линии по u. \en Curvature of line by u.
bool IsPlanar( double accuracy = METRIC_EPSILON ) const override; // \ru Является ли поверхность плоской. \en Whether the surface is planar.
void ChangeCarrier( const MbSpaceItem & item, MbSpaceItem & init ) override; // \ru Изменение носителя. \en Changing of carrier.
void CalculateGabarit( MbCube & ) const override; // \ru Выдать габарит. \en Get the bounding box.
void CalculateLocalGabarit( const MbMatrix3D &, MbCube & ) const override; // \ru Рассчитать габарит относительно л.с.к. \en Calculate bounding box relative to the local coordinate system.
MbSplineSurface * NurbsSurface( double, double, double, double, bool bmatch = false ) const override; // \ru NURBS копия поверхности. \en NURBS copy of a surface.
MbSurface * NurbsSurface( const MbNurbsParameters & uParam, const MbNurbsParameters & vParam ) const override; // \ru NURBS копия поверхности. \en NURBS copy of a surface.
MbSurface * Offset( double d, bool same ) const override; // \ru Создание эквидистантной поверхности. \en Create an offset surface.
// \ru Подобные ли поверхности для объединения (слива) \en Whether the surfaces to union (joining) are similar
bool IsSpecialSimilarToSurface( const MbSurface & surf, VERSION version, double precision = METRIC_PRECISION ) const override; // \ru Специальный случай \en Special case
MbCurve3D * CurveU( double v, MbRect1D *pRgn, bool bApprox = true ) const override; // \ru Пространственная копия линии v = const. \en Spatial copy of 'v = const'-line.
MbCurve3D * CurveV( double u, MbRect1D *pRgn, bool bApprox = true ) const override; // \ru Пространственная копия линии u = const. \en Spatial copy of 'u = const'-line.
// \ru Построить касательные и нормальные плейсменты конструктивных плоскостей. \en Construct tangent and normal placements of constructive planes.
bool CreateNormalPlacements ( const MbVector3D & axisZ, double angle, SArray<MbPlacement3D> & places, VERSION version = Math::DefaultMathVersion() ) const override;
bool CreateTangentPlacements( const MbVector3D & axisZ, SArray<MbPlacement3D> & places ) const override;
// \ru Подобные ли поверхности для объединения (слива). \en Whether the surfaces to union (joining) are similar.
bool IsSimilarToSurface( const MbSurface & surf, VERSION version, double precision = METRIC_PRECISION ) const override;
// \ru Дать двумерную матрицу преобразования из своей параметрической области в параметрическую область surf. \en Get two-dimensional transformation matrix from own parametric region to parametric region of 'surf'.
bool GetMatrixToSurface( const MbSurface & surf, MbMatrix & matr, VERSION version, double precision = METRIC_PRECISION ) const override;
bool GetCenterLines( std::vector<MbCurve3D *> & clCurves ) const override; // \ru Дать осевые (центральные) линии для поверхности. \en Get center lines of a surface.
// \ru Определение разбивки параметрической области поверхности вертикалями и горизонталями. \en Determine splitting of parametric region of surface by vertical and horizontal lines.
void GetTesselation( const MbStepData & stepData,
double u1, double u2, double v1, double v2,
SArray<double> & uu, SArray<double> & vv ) const override;
bool IsSpinePeriodic() const override; // \ru Периодичность направляющей. \en Periodicity of a guide curve.
size_t GetUMeshCount() const override; // \ru Выдать количество полигонов по u. \en Get the count of polygons by u.
size_t GetVMeshCount() const override; // \ru Выдать количество полигонов по v. \en Get the count of polygons by v.
// \ru Включить точку в область определения. \en Include a point into domain.
void IncludePoint( double u, double v ) override;
/** \} */
/** \ru \name Функции кинематической поверхности
\en \name Functions of the evolution surface
\{ */
/** \brief \ru Определение матрицы переноса для образующей.
\en Determination of translation matrix for generating curve. \~
\details \ru Определение матрицы переноса для образующей по параметру направляющей.
\en Determination of translation matrix for generating curve by parameter of guide curve. \~
\param[in] v - \ru Параметр на направляющей
\en Parameter on the guide curve \~
\param[in] matr - \ru Матрица-результат
\en Matrix-result \~
*/
void TransformMatrix( double v, MbMatrix3D & matr ) const;
/// \ru Направляющая. \en Guide curve.
const MbSpine & GetSpine() const { return *spine; }
/// \ru Направляющая кривая. \en The spine (guide) curve.
const MbCurve3D & GetSpineCurve() const { return spine->GetCurve(); }
/// \ru Центр тяжести образующей. \en Center of gravity of generating curve.
const MbCartPoint3D & GetOrigin() const { return origin; }
/// \ru Дать направляющую кривую для изменения. \en Get guide curve for editing.
MbCurve3D & SetSpineCurve() { return spine->SetCurve(); }
/// \ru Задать центр тяжести образующей. \en Set center of gravity of generating curve.
void SetOrigin( const MbCartPoint3D & p ) { origin = p; SetDirtyGabarit(); }
/** \} */
protected :
void Init();
private:
void operator = ( const MbEvolutionSurface & ); // \ru Не реализовано. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL( MbEvolutionSurface )
};
IMPL_PERSISTENT_OPS( MbEvolutionSurface )
//------------------------------------------------------------------------------
/** \brief \ru Создать кинематическую поверхность.
\en Create an evolution surface. \~
\details \ru Создать кинематическую поверхность.
\en Create an evolution surface. \~
\param[in] curve - \ru Образующая кривая
\en Generating curve \~
\param[in] spine - \ru Направляющая кривая
\en Guide curve \~
\param[in] samec - \ru Признак использования оригинала образующей кривой, а не копии.
\en Attribute of usage of original of generating curve, not a copy. \~
\param[in] sames - \ru Признак использования оригинала направляющей кривой spine, а не копии.
\en Attribute of usage of original of guide curve (spine), not a copy. \~
\return \ru Возвращает созданную поверхность.
\en Return the created surface. \~
\ingroup Surface_Modeling
*/
// ---
MATH_FUNC (MbSurface &) CreateEvolutionSurface( const MbCurve3D & curve, const MbSpine & spine, bool samec, bool sames = false );
//------------------------------------------------------------------------------
/** \brief \ru Создать кинематическую поверхность.
\en Create an evolution surface. \~
\details \ru Создать кинематическую поверхность.
\en Create an evolution surface. \~
\param[in] curve - \ru Образующая кривая
\en Generating curve \~
\param[in] spine - \ru Направляющая кривая
\en Guide curve \~
\param[in] samec - \ru Признак использования оригинала образующей кривой, а не копии
\en Attribute of usage of original of generating curve, not a copy \~
\param[in] sames - \ru Признак использования оригинала направляющей кривой, а не копии
\en Attribute of usage of original of guide curve, not a copy \~
\return \ru Возвращает созданную поверхность.
\en Return the created surface. \~
\ingroup Surface_Modeling
*/
// ---
MATH_FUNC (MbSurface &) CreateEvolutionSurface( const MbCurve3D & curve, const MbCurve3D & spine,
bool samec, bool sames );
//------------------------------------------------------------------------------
/** \brief \ru Создать кинематическую поверхность.
\en Create an evolution surface. \~
\details \ru Создать кинематическую поверхность.
\en Create an evolution surface. \~
\param[in] curve - \ru Образующая кривая
\en Generating curve \~
\param[in] spine - \ru Направляющая кривая
\en Guide curve \~
\param[in] spineDirection - \ru Направляющая кривая для направляющей кривой
\en Guide curve for guide curve \~
\param[in] samec - \ru Признак использования оригинала образующей кривой, а не копии
\en Attribute of usage of original of generating curve, not a copy \~
\param[in] sames - \ru Признак использования оригинала направляющей кривой, а не копии
\en Attribute of usage of original of guide curve, not a copy \~
\param[in] samed - \ru Признак использования оригинала кривой spineDirection, а не копии
\en Attribute of usage of original of spineDirection curve, not a copy \~
\return \ru Возвращает созданную поверхность.
\en Return the created surface. \~
\ingroup Surface_Modeling
*/
// ---
MATH_FUNC (MbSurface &) CreatePipeSurface( const MbCurve3D & curve, const MbCurve3D & spine,
const MbCurve3D & spineDirection,
bool samec, bool sames, bool samed );
#endif // __SURF_EVOLUTION_SURFACE_H