Files
Extern/C3d/Include/surf_offset_surface.h
SaraP 58dff21d20 Extern :
- C3d aggiornamento delle librerie ( 117939).
2023-02-14 12:21:38 +01:00

449 lines
39 KiB
C++

////////////////////////////////////////////////////////////////////////////////
/**
\file
\brief \ru Эквидистантная поверхность.
\en Offset surface. \~
*/
////////////////////////////////////////////////////////////////////////////////
#ifndef __SURF_OFFSET_SURFACE_H
#define __SURF_OFFSET_SURFACE_H
#include <templ_three_states.h>
#include <templ_dptr.h>
#include <tool_multithreading.h>
#include <surface.h>
class MATH_CLASS MbSurfaceContiguousData;
//------------------------------------------------------------------------------
/** \brief \ru Эквидистантная и расширенная поверхность.
\en Offset surface. \~
\details \ru Эквидистантная поверхность построена на базовой поверхности basisSurface и располагается на расстоянии от неё, определяемом параметрами offsetUminVmin, offsetUmaxVmin, offsetUminVmax, offsetUmaxVmax.
Параметры offsetUminVmin, offsetUmaxVmin, offsetUminVmax, offsetUmaxVmax могут быть как больше нуля, так и меньше нуля.
Область определения параметров эквидистантной поверхности может отличаться от область определения параметров базовой поверхности basisSurface.
Это отличие задано параметрами deltaUmin, deltaUmax, deltaVmin, deltaVmax.
Радиус-вектор эквидистантной поверхности описывается векторной функцией \n
r(u,v) = basisSurface(u,v) + (Offset0(u,v) * basisSurface->Normal(u,v)). \n
Базовой поверхностью для эквидистантной поверхности не может служить другая эквидистантная поверхность.
В подобной ситуации выполняется переход к первичной базовой поверхности.
\en The offset surface is constructed on 'basisSurface' base surface and placed at distance from it, determined by 'offsetUminVmin, offsetUmaxVmin, offsetUminVmax, offsetUmaxVmax' parameters.
'offsetUminVmin, offsetUmaxVmin, offsetUminVmax, offsetUmaxVmax' parameters can be both greater than zero and less than zero.
Domain of parameters of the offset surface can differs from domain of parameters of basisSurface base surface.
This difference is given by the parameters deltaUmin, deltaUmax, deltaVmin, deltaVmax.
Radius-vector of offset surface is described by the vector function \n
r(u,v) = basisSurface(u,v) + (Offset0(u,v) * basisSurface->Normal(u,v)). \n
Base surface for offset surface can't be other offset surface.
In this situation it changes to the initial base surface. \~
\ingroup Surfaces
*/
// ---
class MATH_CLASS MbOffsetSurface : public MbSurface {
private:
MbSurface * basisSurface; ///< \ru Базовая поверхность (всегда не nullptr). \en Base surface (always not nullptr).
double u0min; ///< \ru Минимальный параметр u базовой поверхности. \en Minimal parameter u of the base surface.
double u0max; ///< \ru Максимальный параметр u базовой поверхности. \en Maximal parameter u of the base surface.
double v0min; ///< \ru Минимальный параметр v базовой поверхности. \en Minimal parameter v of the base surface.
double v0max; ///< \ru Максимальный параметр v базовой поверхности. \en Maximal parameter v of the base surface.
bool u0closed; ///< \ru Признак замкнутости по u базовой поверхности. \en Attribute of closedness of base surface by u.
bool v0closed; ///< \ru Признак замкнутости по v базовой поверхности. \en Attribute of closedness of base surface by v.
double offsetUminVmin; ///< \ru Смещение от базовой поверхности по нормали в точке [u0min v0min]. \en The offset from the base surface along normal in a point [u0min v0min].
double offsetUmaxVmin; ///< \ru Смещение от базовой поверхности по нормали в точке [u0max v0min]. \en The offset from the base surface along normal in a point [u0max v0min].
double offsetUminVmax; ///< \ru Смещение от базовой поверхности по нормали в точке [u0min v0max]. \en The offset from the base surface along normal in a point [u0min v0max].
double offsetUmaxVmax; ///< \ru Смещение от базовой поверхности по нормали в точке [u0max v0max]. \en The offset from the base surface along normal in a point [u0max v0max].
MbeOffsetType type; ///< \ru Тип смещения точек: константный, линейный или кубический. \en The type of points offset: constant, or linear, or cubic.
double deltaUmin; ///< \ru Изменение параметрической области относительно параметра u0min базовой поверхности. \en The change of minimum of the first parameter relative of u0min parameter of the base surface.
double deltaUmax; ///< \ru Изменение параметрической области относительно параметра u0max базовой поверхности. \en The change of maximum of the first parameter relative of u0max parameter of the base surface.
double deltaVmin; ///< \ru Изменение параметрической области относительно параметра v0min базовой поверхности. \en The change of minimum of the second parameter relative of v0min parameter of the base surface.
double deltaVmax; ///< \ru Изменение параметрической области относительно параметра v0max базовой поверхности. \en The change of maximum of the second parameter relative of v0max parameter of the base surface.
private:
//------------------------------------------------------------------------------
/** \brief \ru Вспомогательные данные.
\en Auxiliary data. \~
\details \ru Вспомогательные данные служат для ускорения работы объекта.
\en Auxiliary data are used for fast calculations. \n \~
*/
// ---
class MbOffsetSurfaceAuxiliaryData : public AuxiliaryData {
public:
DPtr<MbSurfaceContiguousData> data; ///< \ru Дополнительные данные о поверхности. \en Additional data about a surface.
MbOffsetSurfaceAuxiliaryData();
MbOffsetSurfaceAuxiliaryData( const MbOffsetSurfaceAuxiliaryData & init );
virtual ~MbOffsetSurfaceAuxiliaryData();
};
mutable CacheManager<MbOffsetSurfaceAuxiliaryData> cache;
public:
/** \brief \ru Конструктор по базовой поверхности и смещению.
\en Constructor by base surface and offset. \~
\details \ru Конструктор по базовой поверхности и смещению.
\en Constructor by base surface and offset. \~
\param[in] s - \ru Базовая поверхность
\en Base surface \~
\param[in] d - \ru Величина смещения
\en Offset distance \~
\param[in] same - \ru Признак использования оригинала базовой поверхности, а не ее копии
\en Attribute of usage of original of base surface, not copy \~
*/
MbOffsetSurface( const MbSurface & s, double d, bool same );
/** \brief \ru Конструктор по базовой поверхности и смещению c приращениями параметров.
\en Constructor by base surface and offset with increments of parameters. \~
\details \ru Конструктор по базовой поверхности и смещению c приращениями параметров.\n
Приращение параметров нужно использовать для изменения области определения поверхности
относительно базовой поверхности.
\en Constructor by base surface and offset with increments of parameters.\n
Increment of parameters needs to be used for change of surface domain
relative to base surface. \~
\param[in] s - \ru Базовая поверхность
\en Base surface \~
\param[in] d - \ru Величина смещения
\en Offset distance \~
\param[in] du0 - \ru Изменение umin параметра
\en The change of umin parameter \~
\param[in] du1 - \ru Изменение umax параметра
\en The change of umax parameter \~
\param[in] dv0 - \ru Изменение umin параметра
\en The change of umin parameter \~
\param[in] dv1 - \ru Изменение umax параметра
\en The change of umax parameter \~
\param[in] same - \ru Признак использования оригинала базовой поверхности, а не ее копии.
\en Attribute of usage of original of base surface, not copy. \~
*/
MbOffsetSurface( const MbSurface & s, double d, double du0, double du1, double dv0, double dv1, bool same );
/** \brief \ru Конструктор по базовой поверхности и смещению c приращениями параметров.
\en Constructor by base surface and offset with increments of parameters. \~
\details \ru Смещение задано в углах параметрической области базовой поверхности и может изменяться по константному, линейному и кубическому законам.\n
Приращение параметров нужно использовать для изменения области определения поверхности относительно базовой поверхности.
\en The offset displacement is defined in the corners of the parametric region of the base surface and can be changed by constant, linear and cubic laws.\n
Increment of parameters needs to be used for change of surface domain relative to base surface. \~
\param[in] s - \ru Базовая поверхность
\en Base surface \~
\param[in] d0 - \ru Величина смещения offsetUminVmin.
\en Offset distance offsetUminVmin. \~
\param[in] d1 - \ru Величина смещения offsetUmaxVmin.
\en Offset distance offsetUmaxVmin. \~
\param[in] d2 - \ru Величина смещения offsetUminVmax.
\en Offset distance offsetUminVmax. \~
\param[in] d3 - \ru Величина смещения offsetUmaxVmax.
\en Offset distance offsetUmaxVmax. \~
\param[in] t - \ru Тип смещения точек: константный, линейный или кубический.
\en The offset type: constant, or linear, or cubic. \~
\param[in] u0 - \ru Изменение umin параметра
\en The change of umin parameter \~
\param[in] u1 - \ru Изменение umax параметра
\en The change of umax parameter \~
\param[in] v0 - \ru Изменение umin параметра
\en The change of umin parameter \~
\param[in] v1 - \ru Изменение umax параметра
\en The change of umax parameter \~
\param[in] same - \ru Признак использования оригинала базовой поверхности, а не ее копии.
\en Attribute of usage of original of base surface, not copy. \~
*/
MbOffsetSurface( const MbSurface & s, double d0, double d1, double d2, double d3, MbeOffsetType t,
double u0, double u1, double v0, double v1, bool same );
protected:
MbOffsetSurface( const MbOffsetSurface &, MbRegDuplicate * );
private:
MbOffsetSurface( const MbOffsetSurface & ); // \ru Не реализовано. \en Not implemented.
public:
virtual ~MbOffsetSurface ();
public:
VISITING_CLASS( MbOffsetSurface );
public:
/** \ru \name Функции инициализации
\en \name Initialization functions
\{ */
/** \brief \ru Инициализация по смещению и приращениям параметров.
\en Initialization by offset and increments of parameters. \~
\details \ru Инициализация по смещению и приращениям параметров.\n
Приращение параметров нужно использовать для изменения области определения поверхности относительно базовой поверхности.
\en Initialization by offset and increments of parameters.\n
Increment of parameters needs to be used for change of surface domain relative to base surface. \~
\param[in] d0 - \ru Величина смещения offsetUminVmin.
\en Offset distance offsetUminVmin. \~
\param[in] d1 - \ru Величина смещения offsetUmaxVmin.
\en Offset distance offsetUmaxVmin. \~
\param[in] d2 - \ru Величина смещения offsetUminVmax.
\en Offset distance offsetUminVmax. \~
\param[in] d3 - \ru Величина смещения offsetUmaxVmax.
\en Offset distance offsetUmaxVmax. \~
\param[in] t - \ru Тип смещения точек: константный, линейный или кубический.
\en The offset type: constant, or linear, or cubic. \~
\param[in] u0 - \ru Изменение umin параметра
\en The change of umin parameter \~
\param[in] u1 - \ru Изменение umax параметра
\en The change of umax parameter \~
\param[in] v0 - \ru Изменение umin параметра
\en The change of umin parameter \~
\param[in] v1 - \ru Изменение umax параметра
\en The change of umax parameter \~
*/
void Init( double d0, double d1, double d2, double d3, MbeOffsetType t, double u0, double u1, double v0, double v1 );
void Init( double d, double u0, double u1, double v0, double v1 );
/** \} */
/** \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 object is a copy.
bool SetEqual ( const MbSpaceItem & ) override; // \ru Сделать равным. \en Make equal.
bool IsSimilar( const MbSpaceItem & ) const override; // \ru Являются ли объекты подобными. \en Determine whether the objects are similar.
bool IsPlanar( double accuracy = METRIC_EPSILON ) const override; // \ru Является ли поверхность плоской. \en Whether the surface is planar.
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 Refresh() override; // \ru Сбросить все временные данные \en Flush all the temporary data
void GetProperties( MbProperties & properties ) override; // \ru Выдать свойства объекта. \en Get properties of the object.
void SetProperties( const MbProperties & properties ) override; // \ru Записать свойства объекта. \en Set properties of the object.
void GetBasisItems ( RPArray<MbSpaceItem> & ) override; // \ru Дать базовые поверхности. \en Get base surfaces.
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 Функции описания области определения поверхности
\en \name Functions for surface domain description
\{ */
double GetUMin () const override; // \ru Вернуть минимальное значение параметра u. \en Return the minimum value of parameter u.
double GetVMin () const override; // \ru Вернуть минимальное значение параметра v. \en Return the minimum value of parameter v.
double GetUMax () const override; // \ru Вернуть максимальное значение параметра u. \en Return the maximum value of parameter u.
double GetVMax () const override; // \ru Вернуть максимальное значение параметра v. \en Return the maximum value of parameter v.
bool IsUClosed () const override; // \ru Проверка замкнутости по параметру u. \en Check of closedness by parameter u.
bool IsVClosed () const override; // \ru Проверка замкнутости по параметру v. \en Check of closedness by parameter v.
double GetUPeriod() const override; // \ru Период по u. \en Period by u.
double GetVPeriod() const override; // \ru Период по v. \en Period by v.
size_t GetUCount() const override; // \ru Получить разбиение по u. \en Get splitting by u.
size_t GetVCount() const override; // \ru Получить разбиение по v. \en Get splitting by v.
bool GetPoleUMin() const override;
bool GetPoleUMax() const override;
bool GetPoleVMin() const override;
bool GetPoleVMax() const override;
bool IsPole( double u, double v, double paramPrecision = PARAM_PRECISION ) const override; // \ru Является ли точка особенной. \en Whether the point is special.
/** \} */
/** \ru \name Функции для работы в области определения поверхности
Функции PointOn, Derive... поверхностей корректируют параметры
при выходе их за пределы прямоугольной области определения параметров.
\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.
\{ */
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; // \ru Третья производная. \en The third derivative.
void DeriveUUV( double & u, double & v, MbVector3D & ) const override; // \ru Третья производная. \en The third derivative.
void DeriveUVV( double & u, double & v, MbVector3D & ) const override; // \ru Третья производная. \en The third derivative.
void DeriveVVV( double & u, double & v, MbVector3D & ) const override; // \ru Третья производная. \en The third derivative.
void Normal ( double & u, double & v, MbVector3D & ) const override; // \ru Нормаль. \en Normal.
void NormalU ( double & u, double & v, MbVector3D & ) const override; // \ru Производная нормали. \en The derivative of normal.
void NormalV ( double & u, double & v, MbVector3D & ) const override; // \ru Производная нормали. \en The derivative of normal.
/** \} */
/** \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; // \ru Третья производная. \en The third derivative.
void _DeriveUUV( double u, double v, MbVector3D & ) const override; // \ru Третья производная. \en The third derivative.
void _DeriveUVV( double u, double v, MbVector3D & ) const override; // \ru Третья производная. \en The third derivative.
void _DeriveVVV( double u, double v, MbVector3D & ) const override; // \ru Третья производная. \en The third derivative.
void _Normal ( double u, double v, MbVector3D & ) const override; // \ru Нормаль. \en Normal.
void _NormalU ( double u, double v, MbVector3D & ) const override; // \ru Производная нормали. \en The derivative of normal.
void _NormalV ( double u, double v, MbVector3D & ) const override; // \ru Производная нормали. \en The derivative of normal.
void _NormalUU ( double u, double v, MbVector3D & ) const override; // \ru Производная нормали. \en The derivative of normal.
void _NormalUV ( double u, double v, MbVector3D & ) const override; // \ru Производная нормали. \en The derivative of normal.
void _NormalVV ( double u, double v, MbVector3D & ) const override; // \ru Производная нормали. \en The derivative of normal.
/** \} */
/** \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;
void _PointNormal( double u, double v,
MbCartPoint3D & pnt, MbVector3D & deru, MbVector3D & derv,
MbVector3D & norm, MbVector3D & noru, MbVector3D & norv,
MbVector3D & deruu, MbVector3D & dervv, MbVector3D & deruv ) const override; // \ru Значения производных в точке. \en Values of derivatives at point.
/** \} */
/** \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 approximation step with consideration of the curvature radius by U.
double StepV ( double u, double v, double sag ) const override; // \ru Вычисление шага аппроксимации с учетом радиуса кривизны по V. \en Calculation of the approximation step with consideration of the curvature radius by V.
double DeviationStepU( double u, double v, double sag ) const override; // \ru Вычисление шага по u при пересечении поверхностей. \en Calculation of step by u while intersecting surfaces.
double DeviationStepV( double u, double v, double sag ) const override; // \ru Вычисление шага по v при пересечении поверхностей. \en Calculation of step by v while intersecting surfaces.
/** \} */
/** \ru \name Общие функции поверхности
\en \name Common functions of surface
\{ */
double CurvatureU ( double u, double v ) const override; // \ru Kривизна линии u. \en Curvature of u-line.
double CurvatureV ( double u, double v ) const override; // \ru Kривизна линии v. \en Curvature of v-line.
// \ru Ближайшая проекция точки на поверхность. \en The nearest point projection onto the surface.
bool NearPointProjection( const MbCartPoint3D & p, double & u, double & v, bool ext, MbRect2D * uvRange = nullptr ) const override;
// \ru Изменение носителя. \en Changing of carrier.
void ChangeCarrier( const MbSpaceItem & item, MbSpaceItem & init ) override;
// \ru Изменение носимых элементов. \en Change a carrier elements.
bool ChangeCarrierBorne( const MbSurface & item, MbSurface & init, const MbMatrix & matr ) override;
const MbSurface & GetBasisSurface() const override; // \ru Дать базовую поверхность. \en Get the base surface.
MbSurface & SetBasisSurface() override; // \ru Дать базовую поверхность. \en Get the base surface.
bool GetCylinderAxis( MbAxis3D & ) const override; // \ru Дать ось вращения для поверхности. \en Get a rotation axis of a surface.
bool GetCenterLines( std::vector<MbCurve3D *> & clCurves ) const override; // \ru Дать осевые (центральные) линии для поверхности. \en Get center lines of a surface.
// \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;
// \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
// \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;
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 Returns parametric region of surface.
void SetLimit( double u1, double v1, double u2, double v2 ) override;
void IncludePoint ( double u, double v ) override; // \ru Включить точку в область определения. \en Include point into domain.
MbSplineSurface * NurbsSurface( double, double, double, double, bool bmatch = false ) const override; // \ru NURBS копия поверхности. \en NURBS copy of a surface.
MbSurface * Offset( double d, bool same ) const override; // \ru Построить смещенную поверхность. \en Create a shifted surface.
bool IsLineU () const override; // \ru Если true все производные по U выше первой равны нулю. \en If true, then all the derivatives by U higher the first one are equal to zero.
bool IsLineV () const override; // \ru Если true все производные по V выше первой равны нулю. \en If true, then all the derivatives by V higher the first one are equal to zero.
// \ru Нахождение проекции точки на поверхность в направлении вектора. Для внутреннего использования. \en Finding of point projections to the surface in direction of the vector. For internal use only.
MbeNewtonResult DirectPointProjectionNewton( const MbCartPoint3D & p, const MbVector3D & _vect, size_t iterLimit,
double & u, double & v, double & w, bool ext ) const override;
// \ru Найти все проекции точки на поверхность вдоль вектора в любом из двух направлений. \en Find all a point projection onto the surface along a vector in either of two directions.
void DirectPointProjection( const MbCartPoint3D & pnt, const MbVector3D & vect, SArray<MbCartPoint> & uv, bool ext, MbRect2D * uvRange = nullptr ) const override;
/** \brief \ru Проверить параметры. Аналог глобальной функции _CheckParams, оптимизированный под использование кэшей.
\en Check parameters. Analogue of the global function _CheckParams, optimized for caches usage. \~
\details \ru Проверить параметры и загнать в область определения, если параметр вышел за полюс.
\en Check parameters and move them inside domain if parameter is out of pole. \~
\param[in] surface - \ru Поверхность.
\en Surface. \~
\param[in] u - \ru Первый параметр.
\en First parameter. \~
\param[in] v - \ru Второй параметр.
\en Second parameter. \~
*/
void CheckSurfParams( double & u, double & v ) const override;
/** \} */
/** \ru \name Функции эквидистантной поверхности
\en \name Functions of the offset surface
\{ */
// \ru Тип смещения точек. \en The type of points offset.
MbeOffsetType GetOffsetType() const { return type; }
// \ru Постоянное ли смещение точек? \en Is const the offset type?
bool IsConstOffset() const { return ( (type == off_Empty) || (type == off_Const) ); }
// \ru Величина смещения. \en The offset distance.
double GetDistance( size_t i ) const {
i = i % 4;
if ( i == 1 ) return offsetUmaxVmin;
else
if ( i == 2 ) return offsetUminVmax;
else
if ( i == 3 ) return offsetUmaxVmax;
return offsetUminVmin;
}
// \ru Средняя величина смещения. \en The average offset distance.
double GetDistance() const { return ( offsetUminVmin + offsetUmaxVmin + offsetUminVmax + offsetUmaxVmax ) / 4; }
/** \brief \ru Установить величины смещения.
\en Set offset distances. \~
\param[in] d - \ru Новая величина смещения
\en New offset distance \~
*/
void SetDistance( double d, size_t i );
// \ru Установить постоянную величину смещения. Set new constant offset distance.
void SetDistance( double d );
/** \brief \ru Проверить корректность точки поверхности.
\en Check the correctness of the point of a surface. \~
\details \ru Проверить корректность точки поверхности по кривизне подложки.\n
Точка считается некорректной, если в ней поверхность самопересекается или имеет излом.
\en Check the correctness of the point of a surface by curvature of substrate.\n
Point is considered incorrect if a surface is self-intersected or has a break in it. \~
\param[in] uv - \ru Точка для проверки
\en Point to check \~
\return \ru true, если точка корректная
\en True if point is correct \~
*/
bool IsCurvatureValid( const MbCartPoint & uv ) const;
/** \} */
private:
void CheckParam ( double & u, double & v ) const; // \ru Проверка параметров (попадание в пределы). \en Check parameters (being in limits).
void CheckExtParam( double & u, double & v, MbOffsetSurfaceAuxiliaryData * ucache ) const; // \ru Проверка параметров (на наличие полюсов). \en Check parameters (for presence of poles).
void CheckPoles ( MbOffsetSurfaceAuxiliaryData * ) const; // \ru Проверить наличие полюсов на краях поверхности \en Check presence of poles on surface boundaries
void CheckPole ( double param, bool isU, MbeSurfacePoleType & poleType, CommonMutex* lock, MbOffsetSurfaceAuxiliaryData * ) const;
// \ru Вычисление эквидистанты и её производных. \en The offset calculation and it derivatives calculation.
double Offset0 ( double u, double v ) const;
double OffsetU ( double u, double v ) const;
double OffsetV ( double u, double v ) const;
double OffsetUU ( double u, double v ) const;
double OffsetUV ( double u, double v ) const;
double OffsetVV ( double u, double v ) const;
double OffsetUUU( double u, double v ) const;
double OffsetUUV( double u, double v ) const;
double OffsetUVV( double u, double v ) const;
double OffsetVVV( double u, double v ) const;
// \ru Точка на расширенной поверхности. \en The point on the extended surface.
void _PointOn( double u, double v, MbCartPoint3D &, MbOffsetSurfaceAuxiliaryData * ) const;
// \ru Частные случаи поверхностей. \en Special cases of surfaces.
MbSplineSurface * CasePlane ( double, double, double, double, bool ) const;
MbSplineSurface * CaseCylinder ( double, double, double, double, bool ) const;
MbSplineSurface * CaseCone ( double, double, double, double, bool ) const;
MbSplineSurface * CaseSphere ( double, double, double, double, bool ) const;
MbSplineSurface * CaseTorus ( double, double, double, double, bool ) const;
MbSplineSurface * CaseFillets ( double, double, double, double, bool ) const;
MbSplineSurface * CaseLine ( double, double, double, double, bool ) const;
MbSplineSurface * CaseRevolution( double, double, double, double, bool ) const;
MbSplineSurface * CaseExtrusion ( double, double, double, double, bool ) const;
MbSplineSurface * CaseSwept ( double, double, double, double, bool ) const;
MbSplineSurface * CaseLofted ( double, double, double, double, bool ) const;
MbSplineSurface * CaseArbitrary ( double, double, double, double, bool ) const;
void operator = ( const MbOffsetSurface & ); // \ru Не реализовано. \en Not implemented.
DECLARE_PERSISTENT_CLASS_NEW_DEL( MbOffsetSurface )
};
IMPL_PERSISTENT_OPS( MbOffsetSurface )
#endif // __SURF_OFFSET_SURFACE_H