Files
Extern/C3d/Include/mb_placement3d.h
SaraP 9b2d995ef5 Extern :
- C3d aggiornamento librerie ( 118029).
2025-04-02 08:30:05 +02:00

1039 lines
64 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 A local coordinate system. \~
*/
////////////////////////////////////////////////////////////////////////////////
#ifndef __MB_PLACEMENT3D_H
#define __MB_PLACEMENT3D_H
#include <mb_cart_point.h>
#include <mb_cart_point3d.h>
#include <mb_matrix3d.h>
#include <mb_enum.h>
class MbDirection;
class MbCurve3D;
class MbCube;
class MbLine3D;
class MbPlacement3D;
namespace c3d // namespace C3D
{
typedef std::pair<MbPlacement3D, MbCartPoint3D> PlacePoint3DPair; ///< \ru Пара ЛСК-точка. \en Pair local coordinate system-point.
typedef std::vector<PlacePoint3DPair> PlacePoint3DPairVector; ///< \ru Вектор пар ЛСК-точка. \en Local coordinate system-point pairs vector.
}
//------------------------------------------------------------------------------
/** \brief \ru Типы локальных систем координат в трёхмерном пространстве.
\en Types of local coordinate systems in three dimensional space. \~
\ingroup Mathematic_Base_3D
*/
// ---
enum MbeLocalSystemType3D
{
ls_CartesianSystem, ///< \ru Декартова система координат. \en Cartesian coordinate system.
ls_CylindricalSystem, ///< \ru Цилиндрическая система координат. \en Cylindrical coordinate system.
ls_SphericalSystem, ///< \ru Сферическая система координат. \en Spherical coordinate system.
};
//------------------------------------------------------------------------------
/** \brief \ru Локальная система координат (ЛСК) в трёхмерном пространстве.
\en Local coordinate system in three dimensional space. \~
\details \ru Локальная система координат в трёхмерном пространстве. \n
В большинстве случаев система координат является правой, а векторы системы ортонормированы.
С помощью преобразований система координат (СК) может стать левой и не ортонормированной.
Локальная система координат является декартовой.
Точка в декартовой системе координат определяется тремя координатами x, y, z.\n
Локальная система может выступать в роли цилиндрической или сферической системы координат.\n
Точка в цилиндрической системе координат определяется тремя координатами r, f, z: \n
r, f - полярные координаты проекции точки на основную плоскость;\n
r - длина проекции радиус-вектора; \n
f - полярный угол проекции радиус-вектора; \n
z - аппликата (расстояние от точки до основной плоскости). \n
При использовании локальной системы координат в роли цилиндрической системы считаем, что: \n
начало координат цилиндрической системы совпадает с началом координат декартовой системы; \n
ось Oz цилиндрической системы координат совпадает с осью Oz декартовой системы; \n
основная плоскость цилиндрической системы координат совпадает с плоскостью Oxy декартовой системы; \n
полярная ось координат цилиндрической системы совпадает с осью Ox декартовой системы; \n
полярный угол f цилиндрической системы отсчитываем от оси Ox к положительному направлению оси Oy. \n
Точка в сферической системе координат определяется тремя координатами r, f, w: \n
r - расстояние от начала координат до точки (длина радиус-вектора);\n
f - угол между проекцией радиус-вектора на плоскость и лучом принадлежащим плоскости (долгота);\n
w - угол между радиус-вектором и нормалью к плоскости сферической системы (полярное расстояние).\n
При использовании локальной системы координат в роли сферической системы считаем, что: \n
начало сферической системы совпадает с началом декартовой системы координат; \n
луч перпендикулярный плоскости сферической системы координат совпадает с осью Oz декартовой системы; \n
плоскость сферической системы координат совпадает с плоскостью Oxy декартовой системы; \n
угол f сферической системы определяется отсчитываем от оси Ox к положительному направлению оси Oy.\n
Для ускорения преобразования координат локальная система имеет дополнительные данные - флаг состояния.\n
Для получения данных системы координат извне следует пользоваться методами Get...\n
Для модификации данных системы координат извне следует пользоваться методами Set..., которые автоматически сбрасывают флаг системы в неустановленное состояние.\n
\en Local coordinate system (LCS) in three dimensional space. \n
Local coordinate system is described by the initial point and three non-parallel vectors.
In most cases the system of coordinates is right, and vectors of system are orthonormalized.
A coordinate system can become left and not orthonormalized via transformations.
Local coordinate system is Cartesian.
A point is defined by three coordinates x, y, z in the Cartesian coordinate system.\n
A local coordinate system may act both as a cylindrical or a spherical coordinate system.\n
A point in a cylindrical coordinate system is defined by three coordinates r, f, z: \n
r, f - polar coordinates of point projection to the main plane;\n
r - length of radius-vector projection; \n
f - polar angle of radius-vector projection; \n
z - z-axis (the distance from point to the main plane). \n
When a local coordinate system is used as a cylindrical coordinate system, it is considered that: \n
the origin of a cylindrical coordinate system is coincident to the origin of Cartesian coordinate system; \n
Oz-axis of a cylindrical coordinate system is coincident to Oz-axis of the Cartesian coordinate system; \n
the main plane of a cylindrical coordinate system is coincident to Oxy-plane of the Cartesian coordinate system; \n
the polar axis of a cylindrical coordinate system is coincident to Ox-axis of the Cartesian coordinate system; \n
the polar angle f of a cylindrical coordinate system is counted from Ox-axis to the positive direction of Oy-axis. \n
A point in a spherical coordinate system is defined by three coordinates r, f, w: \n
r - distance from the origin to a point (length of radius-vector);\n
f - the angle between radius-vector projection to the plane and a ray on the plane (longitude);\n
w - the angle between radius-vector and the normal of spherical coordinate system plane (polar distance).\n
When a local coordinate system is used as a spherical coordinate system, it is considered that: \n
the origin of a spherical coordinate system is coincident to the origin of the Cartesian coordinate system; \n
the ray perpendicular to the plane of a spherical coordinate system is coincident to Oz-axis of the Cartesian coordinate system; \n
the plane of a spherical coordinate system is coincident to Oxy-plane of the Cartesian coordinate system; \n
the angle f of a spherical coordinate system is counted from Ox-axis to the positive direction of Oy-axis.\n
To speed up transformation of coordinates the local coordinate system has additional data - flag of state.\n
Use Get... methods to obtain data of a coordinate system from the outside. \n
To modify data of a coordinate system from the outside use Set... methods that automatically reset the flag of the system to the unspecified state. \n \~
\ingroup Mathematic_Base_3D
*/
// ---
class MATH_CLASS MbPlacement3D {
private:
MbCartPoint3D origin; ///< \ru Положение начала локальной системы координат. \en Position of a coordinate system origin.
MbVector3D axisX; ///< \ru Направление первой оси. \en Direction of the first axis.
MbVector3D axisY; ///< \ru Направление второй оси. \en Direction of the second axis.
MbVector3D axisZ; ///< \ru Направление третьей оси. \en Direction of the third axis.
/**
\brief \ru Состояние локальной системы координат.
\en State of a local coordinate system. \~
\details \ru Состояние локальной системы координат определяется установкой битовых полей: \n
MB_TRANSLATION - начало координат не ноль \n
MB_ROTATION - система координат не единичная \n
MB_LEFT - признак левой системы координат \n
MB_ORTOGONAL - ортогональная система координат, взводится только в случае аффинной системы координат \n
MB_AFFINE - система координат произвольная аффинная \n
MB_UNSET - битовые флаги не установлены \n
При изменении системы координат flag должен быть сброшен в неустановленное состояние MB_UNSET. \n
Если flag == MB_UNSET, то при использовании системы координат происходит определение её состояния.\n
\en State of a local coordinate system is defined by setting-up of bit fields: \n
MB_TRANSLATION - the origin of a coordinate system is not zero \n
MB_ROTATION - a coordinate system is not unit \n
MB_LEFT - attribute of a left coordinate system \n
MB_ORTOGONAL - orthogonal coordinate system, it is set-up only if a coordinate system is affine \n
MB_AFFINE - any affine coordinate system \n
MB_UNSET - bit flags not set \n
'flag' has to be reset to unspecified MB_UNSET state while changing the coordinate system. \n
if 'flag' == MB_UNSET, then the state of coordinate system is specified while it is being used.\n \~
*/
mutable uint8 flag;
public:
/// \ru Константа глобальной системы координат. \en A constant of the global coordinate system.
static const MbPlacement3D global;
public: /** \ru \name Конструкторы.
\en \name The constructors.
\{ */
/// \ru Конструктор по умолчанию. \en Default constructor.
MbPlacement3D();
/// \ru Конструктор по точке. \en Constructor by point.
explicit MbPlacement3D( const MbCartPoint3D & org );
/// \ru Конструктор по двум векторам и точке, ортогонализует вектор `Y` и нормализует все оси. \en Constructor for two vectors and a point. It orthogonalizes the `Y` vector and normalizes all axes.
explicit MbPlacement3D( const MbVector3D & axisX, const MbVector3D & axisY, const MbCartPoint3D & org );
/// \ru Конструктор копирования. \en Copy-constructor.
MbPlacement3D( const MbPlacement3D & place );
/// \ru Конструктор по матрице. \en Constructor by matrix.
MbPlacement3D( const MbMatrix3D & matr );
/// \ru Конструктор по точке и двум векторам. \en Constructor by point and two vectors.
explicit MbPlacement3D( const MbCartPoint3D & org, const MbVector3D & axisZ, const MbVector3D & axisX, bool l = false );
/// \ru Конструктор по трем точкам. \en Constructor by three points.
explicit MbPlacement3D( const MbCartPoint3D & org, const MbCartPoint3D & px, const MbCartPoint3D & py, bool l = false );
/// \ru Конструктор по точке и вектору (ось Z) с произвольной осью X. \en Constructor by point and vector (Z-axis) with arbitrary X-axis.
MbPlacement3D( const MbCartPoint3D & org, const MbVector3D & axisZ, bool l = false );
public: /** \}
\ru \name Функции инициализации.
\en \name Initialization functions.
\{ */
/// \ru Инициализировать единичную матрицу прямого преобразования (мировая СК). \en Initialize identity matrix of a direct transformation (the global coordinate system).
MbPlacement3D & Init();
/// \ru Инициализировать по плейсменту. \en Initialize by a placement.
MbPlacement3D & Init( const MbPlacement3D & );
/// \ru Инициализировать по матрице. \en Initialize by a matrix.
MbPlacement3D & Init( const MbMatrix3D & matr );
/// \ru Инициализировать с произвольной осью 'X'. \en Initialize by point and vector (Z-axis) with arbitrary X-axis.
void Init( const MbCartPoint3D & initOrigin, const MbVector3D & initAxisZ );
/// \ru Инициализировать по началу и векторам осей X, Z. \en Initialize by the origin and vectors of X and Z axes.
MbPlacement3D & Init( const MbCartPoint3D & p, const MbVector3D & axisZ, const MbVector3D & axisX,
bool left = false );
/// \ru Инициализировать по началу и точкам осей X, Y. \en Initialize by the origin and points of X and Y axes.
MbPlacement3D & Init( const MbCartPoint3D & p, const MbCartPoint3D & axisX, const MbCartPoint3D & axisY,
bool left = false );
/// \ru Инициализировать осью Z с произвольной осью X. \en Initialize by Z-axis and arbitrary X-axis.
MbPlacement3D & Init ( const MbCartPoint3D & p, const MbVector3D & axisZ,
bool left );
/// \ru Инициализировать по плейсменту со смещением. \en Initialize by placement with a shift.
MbPlacement3D & Init( const MbPlacement3D & pl, double distance );
/// \ru Инициализировать по началу и ориентирующему плейсменту. \en Initialize by origin and orienting placement.
MbPlacement3D & Init( const MbCartPoint3D & p, const MbPlacement3D & pl );
/// \ru Инициализировать по началу. \en Initialize by origin.
MbPlacement3D & Init( const MbCartPoint3D & org );
// \ru Методы инициализации по началу и двум векторам осям \en Methods for initialization by origin and two vectors of axes
/** \brief \ru Инициализировать по точке и осям `X`,`Y`.
\en Initialize by a point and two vectors (`X` and `Y` axes).
\param[in] p - \ru Задает начало ЛСК. \en Specifies the origin of LCS. \~
\param[in] axisX - \ru Задает ось `X` ЛСК. \en Specifies axis `X` of LCS. \~
\param[in] axisY - \ru Задает ось `Y` ЛСК. \en Specifies axis `Y` of LCS. \~
\param[in] setOrtho - \ru Если setOrtho == true, то ось `Y` ортогонализуется к `X`, а ось ЛСК нормализуются.
\en If setOrtho == true, then the `Y` is orthogonalized to `X`, and the LCS axis is normalized. \~
*/
MbPlacement3D & InitXY( const MbCartPoint3D & p, const MbVector3D & axisX, const MbVector3D & axisY, bool setOrtho );
/// \ru Инициализировать по точке и двум векторам (оси X, Z). \en Initialize by a point and two vectors (X and Z axes).
MbPlacement3D & InitXZ( const MbCartPoint3D & p, const MbVector3D & axisX, const MbVector3D & axisZ );
/// \ru Инициализировать по точке и двум векторам (оси Y, Z). \en Initialize by a point and two vectors (Y and Z axes).
MbPlacement3D & InitYZ( const MbCartPoint3D & p, const MbVector3D & axisY, const MbVector3D & axisZ );
/// \ru Инициализировать по кривой и углу к плоскости. \en Initialize by curve and angle to plane.
bool Init ( const MbPlacement3D & pl, double ang, const MbCurve3D & c, double t );
/// \ru Инициализировать по точке и кривой. \en Initialize by point and curve.
bool Init ( const MbCartPoint3D & p, const MbCurve3D & c, double t );
/// \ru Инициализировать по точке перпендикулярно кривой. \en Initialize by point, perpendicularly to curve.
bool Init ( const MbCurve3D &, const MbCartPoint3D &, bool checkPlanar );
/// \ru Инициализировать по прямой и точке. \en Initialize by a line and a point.
bool Init ( const MbLine3D &, const MbCartPoint3D & );
/// \ru Инициализировать по прямой и вектору. \en Initialize by a line and a vector.
bool Init ( const MbLine3D &, const MbVector3D & );
/// \ru Инициализировать по двум прямым. \en Initialize by two lines.
bool Init ( const MbLine3D & l1, const MbLine3D & l2 );
/// \ru Инициализировать перпендикулярно кривой по параметру на кривой. \en Initialize perpendicularly to a curve by a parameter on the curve.
bool Init ( const MbCurve3D &, double t, bool checkPlanar );
// \ru Методы инициализации для привязки \en Methods for initialization for binding
/// \ru Привязать плейсмент к другим координатам. \en Bind placement to another coordinates.
void Update( const MbPlacement3D &, VERSION version, bool fuzzy_null = true );
/// \ru Привязать плейсмент к другим координатам. \en Bind placement to another coordinates.
void Update( const MbPlacement3D &, const MbPlacement3D & );
/// \ru Привязать плейсмент к локальному нулю. \en Bind placement to the local zero.
void UpdateFromNull( VERSION version, bool fuzzy_null = true ) { Update( MbPlacement3D(), version, fuzzy_null ); }
public: /** \}
\ru \name Булевские свойства.
\en \name The boolean properties.
\{ */
/// \ru Проверить, свойство совпадения с мировой СК (т.е. прямая матрица СК - единичная). \en Check coincidence with the global coordinate system (i.e. the direct matrix of a coordinate system is unit).
bool IsSingle() const { return (MB_IDENTITY == CheckFlag()); }
/// \ru Проверить, присутствует ли сдвиг системы координат относительно глобальной. \en Check if a coordinate system is translated relative to the global coordinate system.
bool IsTranslation() const { return !!(CheckFlag() & MB_TRANSLATION); }
/// \ru Проверить, присутствует ли поворот системы координат относительно глобальной. \en Check if the coordinate system is rotated relative to the global coordinate system.
bool IsRotation() const { return !!(CheckFlag() & MB_ROTATION); }
/// \ru Проверить, является ли СК левой. \en Check if a coordinate system is left.
bool IsLeft() const { return !!(CheckFlag() & MB_LEFT); }
/// \ru Проверить, является ли СК правой. \en Check if a coordinate system is right.
bool IsRight() const { return !(CheckFlag() & MB_LEFT ); }
/// \ru Проверить, является ли СК ортогональной, но ненормированной. \en Check if a coordinate system is orthogonal, but not normalized.
bool IsOrt() const { return !!(CheckFlag() & MB_ORTOGONAL); }
/// \ru Выдать признак ортогональности СК. \en Get orthogonality property of coordinate system.
bool IsOrthogonal() const { CheckFlag(); return ( !(flag & MB_AFFINE) || !!(flag & MB_ORTOGONAL) ); }
/// \ru Проверить, является ли СК аффинной (если нет - то она ортонормированная). \en Check if a coordinate system is affine (otherwise it is orthonormalized).
bool IsAffine() const { return !!(CheckFlag() & MB_AFFINE ); }
/// \ru Проверить, что СК ортонормированная. \en Check if coordinate system is orthonormalized.
bool IsNormal() const { return ( !IsAffine() ); }
/// \ru Проверить, что битовые флаги не установлены. \en Check whether bit flags are not set.
bool IsUnSet() const { return !!( flag & MB_UNSET ); }
/// \ru Выдать признак единичного плейсмента. \en Get attribute of the unit placement.
bool IsUnit( double eps = Math::lengthEpsilon ) const;
/// \ru Выдать признак единичного плейсмента и квадраты ортов. \en Get attribute of unit placement and squares of orts.
bool IsUnit( double & sqX, double & sqY, double & sqZ, double eps = Math::lengthEpsilon ) const;
/// \ru Проверить, являются ли оси СК совпадающими со стандартной (правой ортонормированной СК). \en Check if the axes of a coordinate system are coincident to the standard one (right orthonormalized coordinate system).
bool IsTranslationStandard() const;
/// \ru Проверить, является ли СК ортогональной с равными по длине осями X,Y (круг остается кругом). \en Check if a coordinate system is orthogonal with axes X and Y of equal length (circle moves to circle).
bool IsCircular () const;
/// \ru Проверить, является ли СК ортогональной с равными по длине осями X,Y (круг остается кругом). \en Check if a coordinate system is orthogonal with axes X and Y of equal length (circle moves to circle).
bool IsCircular ( double & lxy ) const;
/// \ru Проверить, является ли СК ортогональной с равными по длине осями X,Y,Z. \en Check if a coordinate system is orthogonal with axes X and Y of equal length.
bool IsIsotropic() const;
/// \ru Проверить, является ли СК ортогональной с равными по длине осями X,Y,Z. \en Check if a coordinate system is orthogonal with axes X and Y of equal length.
bool IsIsotropic( double & l ) const;
public: /** \}
\ru \name Функции доступа к полям.
\en \name Functions for access to fields.
\{ */
/// \ru Получить начало СК. \en Get the origin of a coordinate system.
const MbCartPoint3D & GetOrigin() const { return origin; }
/// \ru Получить ось Z. \en Get the Z-axis.
const MbVector3D & GetAxisZ () const { return axisZ; }
/// \ru Получить ось X. \en Get the X-axis.
const MbVector3D & GetAxisX () const { return axisX; }
/// \ru Получить ось Y. \en Get the Y-axis.
const MbVector3D & GetAxisY () const { return axisY; }
/// \ru Дать начало ЛСК. \en Get the origin of a local coordinate system.
MbCartPoint3D & SetOrigin() { flag = MB_UNSET; return origin; }
/// \ru Дать ось Z. \en Get the Z-axis.
MbVector3D & SetAxisZ () { flag = MB_UNSET; return axisZ; }
/// \ru Дать ось X. \en Get the X-axis.
MbVector3D & SetAxisX () { flag = MB_UNSET; return axisX; }
/// \ru Дать ось Y. \en Get the Y-axis.
MbVector3D & SetAxisY () { flag = MB_UNSET; return axisY; }
/// \ru Задать начало ЛСК. \en Set the origin of a local coordinate system.
void SetOrigin( const MbCartPoint3D & o ) { origin = o; CheckOrigin(); }
/// \ru Задать ось Z. \en Set the Z-axis.
void SetAxisZ ( const MbVector3D & a ) { flag = MB_UNSET; axisZ = a; }
/// \ru Задать ось X. \en Set the X-axis.
void SetAxisX ( const MbVector3D & a ) { flag = MB_UNSET; axisX = a; }
/// \ru Задать ось Y. \en Set the Y-axis.
void SetAxisY ( const MbVector3D & a ) { flag = MB_UNSET; axisY = a; }
/// \ru Инвертировать ось Z. \en Invert the Z-axis.
void AxisZInvert() { flag ^= MB_LEFT; axisZ.Invert(); CheckRotation(); }
/// \ru Инвертировать ось X. \en Invert the X-axis.
void AxisXInvert() { flag ^= MB_LEFT; axisX.Invert(); CheckRotation(); }
/// \ru Инвертировать ось Y. \en Invert the Y-axis.
void AxisYInvert() { flag ^= MB_LEFT; axisY.Invert(); CheckRotation(); }
/// \ru Установить флаг состояния. \en Set the flag of state.
void SetFlag( bool bLeft, bool bAffine = false, bool bOrt = true ) const;
/// \ru Установить СК как правую. \en Set the coordinate system as right.
void SetRight();
public: /** \}
\ru \name Общие функции математического объекта.
\en \name The common functions of the mathematical object.
\{ */
/// \ru Преобразовать согласно матрице. \en Transform according to the matrix.
MbPlacement3D & Transform( const MbMatrix3D & );
/// \ru Сдвинуть вдоль вектора. \en Translate along a vector.
MbPlacement3D & Move( const MbVector3D & );
/// \ru Повернуть вокруг оси на заданный угол. \en Rotate at a given angle around an axis.
MbPlacement3D & Rotate( const MbAxis3D & axis, double angle );
/// \ru Масштабировать. \en Scale.
MbPlacement3D & Scale( double sx, double sy, double sz );
/// \ru Масштабировать. \en Scale.
MbPlacement3D & Scale( double s );
/// \ru Являются ли объекты равными? \en Determine whether an object is equal?
bool IsSame( const MbPlacement3D & other, double accuracy ) const;
/// \ru Дать матрицу преобразования в ЛСК: r=R*into (обратная матрица). \en Get the matrix of transformation to the local coordinate system: r=R*into (inverse matrix).
void GetMatrixInto( MbMatrix3D & ) const;
/// \ru Дать матрицу преобразования в ЛСК: r=R*into (обратная матрица). \en Get the matrix of transformation to the local coordinate system: r=R*into (inverse matrix).
MbMatrix3D GetMatrixInto() const;
/// \ru Дать матрицу преобразования из ЛСК: R=r*from (прямая матрица). \en Get the matrix of transformation from the local coordinate system: R=r*from (direct matrix).
void GetMatrixFrom( MbMatrix3D & ) const;
/// \ru Дать матрицу преобразования из ЛСК: R=r*from (прямая матрица). \en Get the matrix of transformation from the local coordinate system: R=r*from (direct matrix).
MbMatrix3D GetMatrixFrom() const;
/// \ru Дать матрицу симметрии относительно плоскости XY. \en Get the matrix of symmetry with respect to the XY-plane.
void Symmetry ( MbMatrix3D & ) const;
/// \ru Дать матрицу преобразования в place. \en Get the matrix of transformation to place.
bool GetMatrixToPlace( const MbPlacement3D & p, MbMatrix & matr, double eps = Math::angleRegion ) const;
/// \ru Дать матрицу преобразования в place. \en Get the matrix of transformation to place.
void GetMatrixToPlace( const MbPlacement3D & p, MbMatrix3D & matr ) const;
/// \ru Вычислить расстояние до точки. \en Calculate the distance to a point.
double DistanceToPoint ( const MbCartPoint3D & to ) const;
/// \ru Найти проекцию точки на плоскость XY. \en Find point projection to XY-plane.
void PointProjection ( const MbCartPoint3D & p, MbCartPoint3D & pOn ) const;
/// \ru Найти вектор проекции на плоскость XY. \en Find the vector of projection to XY-plane.
void VectorProjection( const MbVector3D & v, double & x, double & y ) const;
/// \ru Найти проекцию точки на плоскость XY. \en Find the point projection to XY-plane.
void PointProjection ( const MbCartPoint3D & p, double & x, double & y ) const;
/// \ru Найти проекцию точки на плоскость XY вдоль вектора в любом из двух направлений. \en Find the point projection to XY-plane along a vector in either of two directions.
bool DirectPointProjection( const MbCartPoint3D & p, const MbVector3D & v, double & x, double & y ) const;
/// \ru Найти проекцию точки на плоскость XY в направлении вектора. \en Find the point projection to XY-plane in direction of the vector.
bool NearDirectPointProjection( const MbCartPoint3D & p, const MbVector3D & v, double & x, double & y, bool onlyPositiveDirection ) const;
/// \ru Дать координаты точки на плоскости XY. \en Get the projection of a point on XY-plane.
void PointOn ( double x, double y, MbCartPoint3D & p ) const { p.Set( origin, axisX, x, axisY, y ); }
/// \ru Дать пространственную точку по точке на плоскости XY. \en Get the space point by a point on XY-plane.
void PointOn ( const MbCartPoint & r, MbCartPoint3D & p ) const { p.Set( origin, axisX, r.x, axisY, r.y ); }
/// \ru Дать пространственный вектор по вектору на плоскости XY. \en Get the space vector by a vector on XY-plane.
void VectorOn( const MbVector & r, MbVector3D & p ) const { p.Set( axisX, r.x, axisY, r.y ); }
/// \ru Дать пространственный вектор по вектору на плоскости XY. \en Get the space vector by a vector on XY-plane.
void VectorOn( const MbDirection & r, MbVector3D & p ) const { p.Set( axisX, r.ax, axisY, r.ay ); }
/// \ru Дать нормаль плоскости XY локальной системы координат, направление оси Z при этом не учитывается. \en Get the normal of the plane XY of a local coordinate system, the Z axis is not taken into account here.
void Normal( MbVector3D & n ) const;
/// \ru Дать нормаль плоскости XY локальной системы координат, направление оси Z при этом не учитывается. \en Get the normal of the plane XY of a local coordinate system, the Z axis is not taken into account here.
MbVector3D Normal() const;
// \ru C какой стороны от плоскости находится точка. \en Point location relative to the plane.
// \ru iloc_OnItem = 0 - на плоскости \en Iloc_OnItem = 0 - on plane
// \ru iloc_InItem = 1 - над плоскостью \en Iloc_InItem = 1 - above plane
// \ru iloc_OutOfItem = -1 - под плоскостью \en Iloc_OutOfItem = -1 - below plane
/// \ru Определить, с какой стороны от плоскости находится точка. \en Get point location relative to the plane.
MbeItemLocation PointRelative( const MbCartPoint3D & pnt, double eps = ANGLE_REGION ) const;
// \ru C какой стороны от плоскости находится габарит. \en Bounding box location relative to the plane.
// \ru iloc_OnItem = 0 - на плоскости \en Iloc_OnItem = 0 - on plane
// \ru iloc_InItem = 1 - над плоскостью \en Iloc_InItem = 1 - above plane
// \ru iloc_OutOfItem = -1 - под плоскостью \en Iloc_OutOfItem = -1 - below plane
/// \ru Определить, с какой стороны от плоскости находится габарит. \en Get bounding box location relative to the plane.
MbeItemLocation CubeRelative( const MbCube & cube, double eps = ANGLE_REGION ) const;
// \ru Проверки расположения. \en Location checks.
/// \ru Проверить коллинеарность. \en Check collinearity
bool Colinear ( const MbPlacement3D & with, double eps = Math::angleRegion ) const;
/// \ru Проверить коллинеарность нормалей. \en Check collinearity of normals.
bool NormalColinear( const MbPlacement3D & with, double eps = Math::angleRegion ) const;
/// \ru Проверить компланарность. \en Check complanarity.
bool Complanar ( const MbPlacement3D & with, double eps = Math::angleRegion ) const;
/// \ru Проверить ортогональность. \en Check orthogonality.
bool Orthogonal ( const MbAxis3D &, double & x, double & y, double eps = Math::angleRegion ) const;
/// \ru Совместить с place путем вращения до параллельности и перемещения вдоль нормали place. \en Match with the place by rotation till the parallelism and translation along place normal.
void AdaptToPlace ( const MbPlacement3D & );
/// \ru Угол с осью Z. \en Angle to Z-axis.
double Angle( const MbVector3D & v ) const { return v.Angle(axisZ); }
/// \ru Угол между осями Z плейсментов. \en Angle between Z-axes of the placements.
double Angle( const MbPlacement3D & ) const;
/// \ru Дать синус угла вектора с плоскостью. \en Get the sine of angle between a vector and the plane.
double GetNormalAngle( const MbVector3D & ) const;
/// \ru Пересчитать СК по измененным внутренним данным. \en Recalculate the coordinate system for changed internal data.
void Reset ();
/// \ru Инвертировать. \en Invert.
void Invert( MbMatrix * = nullptr );
/** \brief \ru Найти ближайшую точку пересечения с линией.
\en Find the nearest point of intersection with line. \~
\details \ru Найти ближайшую точку пересечения с линией. Линия задана своими начальной точкой и направляющим вектором: p(d) = origin + d * direction.\n
\en Find the nearest point of intersection with a line. The line is set by its origin and direction: p(d) = origin + d * direction.\n \~
\param[in] origin - \ru Начальная точка исходной линии.
\en The origin of the input line. \~
\param[in] direction - \ru Направляющий вектор исходной линии.
\en The direction of the input line. \~
\param[out] p - \ru Найденная точка пересечения.
\en The found intersection point. \~
\param[out] d - \ru Параметр точки пересечения на линии.
\en A parameter of the intersection point along the line. \~
\param[in] eps - \ru Толерантность, при которой линия будет считаться параллельной плоскости.
\en A tolerance determining the situation when the line is parallel to the plane. \~
\result \ru Возвращает true, если пересечение найдено.
\en Returns true if the intersection point has been found. \~
\ingroup Mathematic_Base_3D
*/
bool LineIntersectionPoint( const MbCartPoint3D & origin, const MbVector3D & direction, MbCartPoint3D & p, double & d, double eps = ANGLE_EPSILON ) const;
/// \ru Получить точку и направление линии пересечения плоскостей. \en Get the point and direction of planes intersection line.
bool PlanesIntersection ( const MbPlacement3D & place, MbCartPoint3D & p, MbVector3D & axis, double eps = ANGLE_EPSILON ) const;
/// \ru Нахождение точки пересечения плоскости XY и кривой. \en Intersection plane XY with a curve.
MbeNewtonResult CurveIntersectNewton( const MbCurve3D & curve, bool ext, double funcEpsilon, size_t iterLimit,
double & u, double & v, double & t ) const;
/// \ru Вычислить параметры ближайших точек плоскости XY и кривой. \en Calculate parameters of the nearest points of surface and curve. \~
MbeNewtonResult NearestPoints( const MbCurve3D & curve, bool ext, double & u0, double & v0,
double & t0, double & dmin, bool tCalc ) const;
/// \ru Преобразовать 2D-точки в другую 2D-точку. \en Transform 2D-point to another 2D-point.
void TransformPoint ( const MbMatrix3D &, MbCartPoint & ) const;
/// \ru Дать минимально различимую величину параметра U. \en Give the minimum distinguishable value of U parameter.
double GetXEpsilon() const;
/// \ru Дать минимально различимую величину параметра V. \en Get the minimum distinguishable value of V parameter.
double GetYEpsilon() const;
/// \ru Округлить. \en Round.
bool SetRoundedValue( bool total, double eps );
/// \ru Проверить на равенство. \en Check for equality.
bool operator == ( const MbPlacement3D & ) const;
/// \ru Проверить на неравенство. \en Check for inequality.
bool operator != ( const MbPlacement3D & ) const;
/// \ru Присвоить другую СК. \en Assign another coordinate system.
void operator = ( const MbPlacement3D & );
/// \ru Умножить на локальную систему (как перемножение матриц): P = this * p. \en Multiply by a local coordinate system: P = this * p (as of matrix multiplication).
MbPlacement3D operator * ( const MbPlacement3D & p ) const;
/// \ru Ортогонализовать и нормализовать оси ЛСК. \en Orthogonalize and normalize axes of a local coordinate system.
void Normalize();
/// \ru Проверить,является ли объект смещением. \en Check if the object is a translation.
bool IsShift ( const MbPlacement3D &, MbVector3D &, bool & isSame, double accuracy = LENGTH_EPSILON ) const;
/// \ru Является ли объект смещением данного вдоль оси Z? \en Check if the object is a shift of the current one along axis Z?
bool IsShiftZ( const MbPlacement3D & other, MbVector3D & vect, double accuracy ) const;
/// \ru Проверить на вырожденность. \en Check for degeneracy.
bool IsDegenerate( double lenEps = Math::metricRegion, double angEps = Math::angleRegion ) const;
public: /** \}
\ru \name Функции для перевода точек и векторов
\en \name Functions for points and vectors transformation
\{ */
/// \ru Дать точку в глобальной СК по локальным координатам. \en Get the point in the global coordinate system by local coordinates.
void GetPointFrom ( double x0, double y0, double z0, MbCartPoint3D & p,
MbeLocalSystemType3D type = ls_CartesianSystem ) const;
/// \ru Дать вектор в глобальной СК по локальным координатам. \en Get the vector in the global coordinate system by local coordinates.
void GetVectorFrom( double x1, double y1, double z1, MbVector3D & v,
MbeLocalSystemType3D type = ls_CartesianSystem ) const;
/// \ru Перевести точку из локальной в глобальную СК. \en Transform a point from a local coordinate system to the global coordinate system.
void GetPointFrom ( MbCartPoint3D & p, MbeLocalSystemType3D type = ls_CartesianSystem ) const;
/// \ru Перевести вектор из локальной в глобальную СК. \en Transform a vector from a local coordinate system to the global coordinate system.
void GetVectorFrom( MbVector3D & v, MbeLocalSystemType3D type = ls_CartesianSystem ) const;
/// \ru Перевести точку из глобальной в локальную СК. \en Transform a point from the global coordinate system to a local coordinate system.
void GetPointInto ( MbCartPoint3D & p, MbeLocalSystemType3D type = ls_CartesianSystem ) const;
/// \ru Перевести вектор из глобальной в локальную СК. \en Transform a vector from the global coordinate system to a local coordinate system.
void GetVectorInto( MbVector3D & v, MbeLocalSystemType3D type = ls_CartesianSystem ) const;
/// \ru Перевести точку и первые три производные из локальной в глобальную СК. \en Transform a point and the first three derivatives from a local coordinate system to the global coordinate system.
void GetPointAndDerivesFrom( MbCartPoint3D & point, MbVector3D & firstDer,
MbVector3D & secondDer, MbVector3D & thirdDer,
MbeLocalSystemType3D type = ls_CartesianSystem ) const;
/// \ru Перевести точку и первые три производные из глобальной в локальную СК. \en Transform a point and the first three derivatives from the global coordinate system to a local coordinate system.
void GetPointAndDerivesInto( MbCartPoint3D & point, MbVector3D & firstDer,
MbVector3D & secondDer, MbVector3D & thirdDer,
MbeLocalSystemType3D type = ls_CartesianSystem ) const;
/** \} */
/// \ru Выдать свойства объекта. \en Get properties of the object.
void GetProperties( MbProperties & );
/// \ru Записать свойства объекта. \en Set properties of the object.
void SetProperties( const MbProperties & );
private :
// \ru Выставить флаги. \en Set flags.
uint8 ResetFlag() const;
// Оценить флаги, если оценки не было
uint8 CheckFlag() const { return IsUnSet() ? ResetFlag() : flag; }
// Проверить флаг смещения.
void CheckOrigin() const { uint8 val = flag; ::CheckOrigin3D( *this, val, true ); flag = val; }
// \ru Проверить флаг вращения. \en Check rotation flag.
void CheckRotation() const { uint8 val = flag; ::CheckRotation3D( *this, val, true ); flag = val; }
KNOWN_OBJECTS_RW_REF_OPERATORS_EX_BASE( MbPlacement3D, MATH_FUNC_EX )
DECLARE_NEW_DELETE_CLASS( MbPlacement3D )
DECLARE_NEW_DELETE_CLASS_EX( MbPlacement3D )
};
//------------------------------------------------------------------------------
// \ru Конструктор. \en Constructor.
// ---
inline MbPlacement3D::MbPlacement3D()
: origin( 0.0, 0.0, 0.0 )
, axisX ( 1.0, 0.0, 0.0 )
, axisY ( 0.0, 1.0, 0.0 )
, axisZ ( 0.0, 0.0, 1.0 )
, flag ( MB_IDENTITY )
{
}
//------------------------------------------------------------------------------
// \ru Конструктор. \en Constructor.
// ---
inline MbPlacement3D::MbPlacement3D( const MbCartPoint3D & org )
: origin( org )
, axisX ( 1.0, 0.0, 0.0 )
, axisY ( 0.0, 1.0, 0.0 )
, axisZ ( 0.0, 0.0, 1.0 )
, flag ( MB_IDENTITY )
{
CheckOrigin();
}
//------------------------------------------------------------------------------
// \ru Конструктор. \en Constructor.
// ---
inline MbPlacement3D::MbPlacement3D( const MbVector3D & axisX, const MbVector3D & axisY, const MbCartPoint3D & org )
: origin( 0.0, 0.0, 0.0 )
, axisX ( 1.0, 0.0, 0.0 )
, axisY ( 0.0, 1.0, 0.0 )
, axisZ ( 0.0, 0.0, 1.0 )
, flag( MB_UNSET )
{
InitXY( org, axisX, axisY, true/*normalize*/);
}
//------------------------------------------------------------------------------
// \ru Конструктор. \en Constructor.
// ---
inline MbPlacement3D::MbPlacement3D( const MbPlacement3D & place )
: origin( 0.0, 0.0, 0.0 )
, axisX ( 1.0, 0.0, 0.0 )
, axisY ( 0.0, 1.0, 0.0 )
, axisZ ( 0.0, 0.0, 1.0 )
, flag( MB_UNSET )
{
Init( place );
}
//------------------------------------------------------------------------------
// \ru Конструктор \en Constructor
// ---
inline MbPlacement3D::MbPlacement3D( const MbMatrix3D & matr )
: origin( 0.0, 0.0, 0.0 )
, axisX ( 1.0, 0.0, 0.0 )
, axisY ( 0.0, 1.0, 0.0 )
, axisZ ( 0.0, 0.0, 1.0 )
, flag( MB_UNSET )
{
Init( matr );
}
//------------------------------------------------------------------------------
// \ru Инициализация единичной матрицы (мировая СК). \en Initialize.
// ---
inline MbPlacement3D & MbPlacement3D::Init()
{
origin.SetZero();
axisX.Init( 1.0, 0.0, 0.0 );
axisY.Init( 0.0, 1.0, 0.0 );
axisZ.Init( 0.0, 0.0, 1.0 );
flag = MB_IDENTITY;
return *this;
}
//------------------------------------------------------------------------------
// \ru Инициализация по плейсменту. \en Initialize by placement.
// ---
inline MbPlacement3D & MbPlacement3D::Init( const MbPlacement3D & place )
{
origin = place.origin;
axisZ = place.axisZ;
axisX = place.axisX;
axisY = place.axisY;
flag = place.flag;
return *this;
}
//------------------------------------------------------------------------------
// \ru Инициализация по плейсменту и расстоянию. \en Initialize by placement and distance.
// ---
inline MbPlacement3D & MbPlacement3D::Init( const MbPlacement3D & init, double distance )
{
Init( init );
return Move( Normal() * distance );
}
//------------------------------------------------------------------------------
// \ru Инициализация по точке и плейсменту. \en Initialize by point and placement.
// ---
inline MbPlacement3D & MbPlacement3D::Init( const MbCartPoint3D & p, const MbPlacement3D & init )
{
return Init( p, init.axisZ, init.axisX );
}
//------------------------------------------------------------------------------
// \ru Инициализация по точке. \en Initialize by point.
// ---
inline MbPlacement3D & MbPlacement3D::Init( const MbCartPoint3D & p )
{
return Init( p, axisZ, axisX );
}
//------------------------------------------------------------------------------
// \ru Сдвиг по вектору. \en Move by vector.
// ---
inline MbPlacement3D & MbPlacement3D::Move( const MbVector3D & to )
{
origin.Move( to );
CheckOrigin();
return *this;
}
//------------------------------------------------------------------------------
// \ru Трансформация по матрице. \en Transform by matrix.
// ---
inline MbPlacement3D & MbPlacement3D::Transform( const MbMatrix3D & matr )
{
origin.Transform( matr );
if ( matr.IsRotation() ) {
axisZ.Transform( matr );
axisX.Transform( matr );
axisY.Transform( matr );
flag = MB_UNSET;
}
ResetFlag();
return *this;
}
//------------------------------------------------------------------------------
// \ru Расстояние до точки. \en Get distance to point.
// ---
inline double MbPlacement3D::DistanceToPoint( const MbCartPoint3D & to ) const
{
MbCartPoint3D pOn;
PointProjection( to, pOn );
return pOn.DistanceToPoint( to );
}
//------------------------------------------------------------------------------
// \ru Спроецировать точку на плоскость XY. \en Get point projection onto XY-plane.
// ---
inline void MbPlacement3D::PointProjection( const MbCartPoint3D & p, MbCartPoint3D & pOn ) const
{
double x, y;
PointProjection( p, x, y );
PointOn( x, y, pOn );
}
//------------------------------------------------------------------------------
// \ru Спроецировать точку на плоскость XY. \en Get point projection onto XY-plane.
// ---
inline void MbPlacement3D::PointProjection( const MbCartPoint3D & p, double & x, double & y ) const
{
MbVector3D vect( origin, p );
VectorProjection( vect, x, y );
}
//------------------------------------------------------------------------------
// \ru Дать матрицу для преобразования симметрии относительно плоскости. \en Get symmetry matrix relative to XY-plane.
// ---
inline void MbPlacement3D::Symmetry( MbMatrix3D & sym ) const {
sym.Symmetry( origin, axisX, axisY );
}
//------------------------------------------------------------------------------
// \ru Дать матрицу преобразования в place. \en Get transformation matrix from this to place.
// ---
inline void MbPlacement3D::GetMatrixToPlace( const MbPlacement3D & place, MbMatrix3D & matr ) const {
matr = ( GetMatrixFrom() * place.GetMatrixInto() );
}
//-------------------------------------------------------------------------------
// \ru Сделать с.к. правой \en Make the coordinate system right
// ---
inline void MbPlacement3D::SetRight()
{
if ( IsLeft() ) {
axisZ.Invert();
flag &= ~MB_LEFT;
}
}
//------------------------------------------------------------------------------
// \ru Являются ли оси с.к. совпадающими со стандартной (правой ортонормированной с.к.) \en Check if the axes of a coordinate system are coincident to a standard one (right orthonormalized coordinate system)
// ---
inline bool MbPlacement3D::IsTranslationStandard() const
{
if ( !IsNormal() && IsRight() ) {
const double eps = ANGLE_EPSILON;
if ( axisX.Colinear( MbVector3D::xAxis, eps ) && axisY.Colinear( MbVector3D::yAxis, eps ) && axisZ.Colinear( MbVector3D::zAxis, eps ) )
return true;
}
return false;
}
//------------------------------------------------------------------------------
// \ru Является ли с.к. ортогональной с равными по длине осями X,Y (круг остается кругом) \en Whether a coordinate system is orthogonal with the axes X and Y of equal length (circle moves to circle)
// ---
inline bool MbPlacement3D::IsCircular() const
{
if ( IsNormal() )
return true;
else {
bool isOrthogonal = IsOrthogonal();
if ( !isOrthogonal ) { // BUG_55499
if ( axisX.Orthogonal( axisY, EXTENT_EPSILON ) )
isOrthogonal = true;
}
if ( isOrthogonal ) {
if ( c3d::EqualLengths( axisX.Length(), axisY.Length() ) )
return true;
}
}
return false;
}
//------------------------------------------------------------------------------
// \ru Является ли с.к. ортогональной с равными по длине осями X,Y (круг остается кругом) \en Whether a coordinate system is orthogonal with the axes X and Y of equal length (circle moves to circle)
// ---
inline bool MbPlacement3D::IsCircular( double & lxy ) const
{
lxy = 1.0;
if ( IsNormal() )
return true;
else {
bool isOrthogonal = IsOrthogonal();
if ( !isOrthogonal ) { // BUG_55499
if ( axisX.Orthogonal( axisY, EXTENT_EPSILON ) )
isOrthogonal = true;
}
if ( isOrthogonal ) {
double lx = axisX.Length();
double ly = axisY.Length();
if ( c3d::EqualLengths( lx, ly ) ) {
lxy = 0.5 * (lx + ly);
return true;
}
}
}
return false;
}
//------------------------------------------------------------------------------
// \ru Является ли с.к. ортогональной и изотропной по осям \en Whether a coordinate system is orthogonal and isotropic by axes
// ---
inline bool MbPlacement3D::IsIsotropic() const
{
if ( IsNormal() )
return true;
else if ( IsOrthogonal() ) {
double lx = axisX.Length();
double ly = axisY.Length();
if ( c3d::EqualLengths( lx, ly ) ) {
double lz = axisZ.Length();
if ( c3d::EqualLengths( lz, lx ) && c3d::EqualLengths( lz, ly ) )
return true;
}
}
return false;
}
//------------------------------------------------------------------------------
// \ru Является ли с.к. ортогональной и изотропной по осям \en If coordinate system is orthogonal and isotropic by axes
// ---
inline bool MbPlacement3D::IsIsotropic( double & l ) const
{
l = 1.0;
if ( IsNormal() )
return true;
else if ( IsOrthogonal() ) {
double lx = axisX.Length();
double ly = axisY.Length();
if ( c3d::EqualLengths( lx, ly ) ) {
double lz = axisZ.Length();
if ( c3d::EqualLengths( lz, lx ) && c3d::EqualLengths( lz, ly ) ) {
l = (lx + ly + lz) * c3d::ONE_THIRD;
if ( ::fabs(l - 1.0) < EPSILON )
l = 1.0;
return true;
}
}
}
return false;
}
//------------------------------------------------------------------------------
// \ru Дать нормаль \en Give the normal
// ---
inline void MbPlacement3D::Normal( MbVector3D & n ) const
{
// This disabled code is faster, but it breaks some models that have not good fillets. Difference is in 1e-16.
//if ( IsNormal() ) {
// n.Init( axisZ );
// if ( IsLeft() )
// n.Invert();
//}
//else
if ( IsOrt() ) {
n.Init( axisZ );
if ( IsLeft() )
n.Invert();
if ( IsAffine() )
n.Normalize();
}
else {
::SetVecM( n, axisX, axisY );
n.Normalize();
}
}
//------------------------------------------------------------------------------
// \ru Дать нормаль \en Give the normal
// ---
inline MbVector3D MbPlacement3D::Normal() const
{
MbVector3D n;
Normal( n );
return n;
}
//------------------------------------------------------------------------------
// \ru Проверка на равенство \en Check for equality
// ---
inline bool MbPlacement3D::operator == ( const MbPlacement3D & with ) const
{
return ( ( origin == with.origin ) &&
( axisZ == with.axisZ ) &&
( axisY == with.axisY ) &&
( axisX == with.axisX ) );
}
//------------------------------------------------------------------------------
// \ru Проверка на неравенство \en Check for inequality
// ---
inline bool MbPlacement3D::operator != ( const MbPlacement3D & with ) const {
return !( *this == with );
}
//------------------------------------------------------------------------------
// \ru Оператор присвоения \en Assignment operator
// ---
inline void MbPlacement3D::operator = ( const MbPlacement3D & pl )
{
origin = pl.origin;
axisZ = pl.axisZ;
axisY = pl.axisY;
axisX = pl.axisX;
flag = pl.flag;
}
//------------------------------------------------------------------------------
// \ru Преобразование 2D-точки в другую 2D-точку \en Transformation of 2D-point to another 2D-point
// ---
inline void MbPlacement3D::TransformPoint( const MbMatrix3D & matr, MbCartPoint & p2d ) const
{
MbCartPoint3D p3d( origin );
p3d.Add( axisX, p2d.x, axisY, p2d.y );
p3d.Transform( matr );
p2d.Init( p3d.x, p3d.y );
}
//-------------------------------------------------------------------------------
// \ru Является ли объект смещением данного? \en Check if the object is a shift of the current one.
// ---
inline bool MbPlacement3D::IsShift( const MbPlacement3D & other, MbVector3D & vect, bool & isSame, double accuracy ) const
{
if ( axisZ.IsSame(other.axisZ, accuracy) &&
axisY.IsSame(other.axisY, accuracy) &&
axisX.IsSame(other.axisX, accuracy) ) {
vect.Init( origin, other.origin );
isSame = ( vect.MaxFactor() < accuracy );
return true;
}
return false;
}
//-------------------------------------------------------------------------------
// \ru Является ли объект смещением данного вдоль оси Z? \en Check if the object is a shift of the current one along axis Z?
// ---
inline bool MbPlacement3D::IsShiftZ( const MbPlacement3D & other, MbVector3D & vect, double accuracy ) const
{
if ( axisZ.IsSame(other.axisZ, accuracy) &&
axisY.IsSame(other.axisY, accuracy) &&
axisX.IsSame(other.axisX, accuracy) ) {
vect.Init( origin, other.origin );
if ( axisZ.RoundColinear(vect, accuracy) )
return true;
}
return false;
}
//-------------------------------------------------------------------------------
/** \brief \ru Функция перевода координат из декартовой системы в цилиндрическую
\en Function for transforming coordinates from the Cartesian coordinate system to a cylindrical coordinate system \~
\details \ru Функция перевода координат из декартовой системы в цилиндрическую
\en Function for transforming coordinates from Cartesian coordinate system to a cylindrical coordinate system \~
\param[in, out] x, y, z - \ru Исходный координаты.
\en Source coordinates. \~
\ingroup Mathematic_Base_3D
*/
//---
MATH_FUNC (void) CartesianToCylindrical( double & x, double & y, double & z );
//-------------------------------------------------------------------------------------
/** \brief \ru Функция перевода координат из цилиндрической системы в декартову
\en Function for transforming coordinates from a cylindrical coordinate system to a Cartesian coordinate system \~
\details \ru Функция перевода координат из цилиндрической системы в декартову
\en Function for transforming coordinates from a cylindrical coordinate system to a Cartesian coordinate system \~
\param[in, out] \ru x, y, z - Исходный координаты.
out] \en x, y, z - Source coordinates. \~
\ingroup Mathematic_Base_3D
*/
//---
MATH_FUNC (void) CylindricalToCartesian( double & x, double & y, double & z );
//-------------------------------------------------------------------------------------
/** \brief \ru Функция перевода координат из цилиндрической системы в сферическую
\en Function for transforming coordinates from a cylindrical coordinate system to a spherical coordinate system \~
\details \ru Функция перевода координат из цилиндрической системы в сферическую
\en Function for transforming coordinates from a cylindrical coordinate system to a spherical coordinate system \~
\param[in, out] \ru x, y, z - Исходный координаты.
out] \en x, y, z - Source coordinates. \~
\ingroup Mathematic_Base_3D
*/
//---
MATH_FUNC (void) CylindricalToSpherical( double & x, double & y, double & z );
//-------------------------------------------------------------------------------------
/** \brief \ru Функция перевода координат из декартовой системы в сферическую
\en Function for transforming coordinates from a Cartesian coordinate system to a spherical coordinate system \~
\details \ru Функция перевода координат из декартовой системы в сферическую
\en Function for transforming coordinates from a Cartesian coordinate system to a spherical coordinate system \~
\param[in, out] \ru x, y, z - Исходный координаты.
out] \en x, y, z - Source coordinates. \~
\ingroup Mathematic_Base_3D
*/
//---
MATH_FUNC (void) CartesianToSpherical ( double & x, double & y, double & z );
//-------------------------------------------------------------------------------------
/** \brief \ru Функция перевода координат из сферической системы в декартову
\en Function for transforming coordinates from a spherical coordinate system to a Cartesian coordinate system \~
\details \ru Функция перевода координат из сферической системы в декартову
\en Function for transforming coordinates from a spherical coordinate system to a Cartesian coordinate system \~
\param[in, out] \ru x, y, z - Исходный координаты.
out] \en x, y, z - Source coordinates. \~
\ingroup Mathematic_Base_3D
*/
//---
MATH_FUNC (void) SphericalToCartesian ( double & x, double & y, double & z );
//-------------------------------------------------------------------------------------
/** \brief \ru Функция перевода координат из сферической системы в цилиндрическую
\en Function for transforming coordinates from a spherical coordinate system to a cylindrical coordinate system \~
\details \ru Функция перевода координат из сферической системы в цилиндрическую
\en Function for transforming coordinates from a spherical coordinate system to a cylindrical coordinate system \~
\param[in, out] \ru x, y, z - Исходный координаты.
out] \en x, y, z - Source coordinates. \~
\ingroup Mathematic_Base_3D
*/
//---
MATH_FUNC (void) SphericalToCylindrical( double & x, double & y, double & z );
#endif // __MB_PLACEMENT3D_H