DATAKIT API  V2025.4
dtk_dir.hpp
Go to the documentation of this file.
1 #ifndef __DTK_DIR_HPP__
2 #define __DTK_DIR_HPP__
4 #include "def/define.h"
5 #include <iosfwd>
6 
7 class CDtk_3dMat;
8 class Dtk_pnt;
14 class Dtk_dir:public Dtk_pnt
15 {
16 public:
18  ~Dtk_dir() {}
19  Dtk_dir( const Dtk_dir& s );
20  Dtk_dir( const Dtk_pnt& pnt );
21  Dtk_dir( double a, double b, double c = 0.0 );
22  Dtk_dir( const Dtk_pnt&, const Dtk_pnt& );
24  Dtk_dir operator+() const;
25  Dtk_dir operator-() const;
30  Dtk_dir& operator*=( double );
31  Dtk_dir& operator/=( double );
32  double norm() const;
33  int normalize();
34  int rotate( const Dtk_dir& Z, double angle );
35 
37  SetAsDeprecated( "Undefined", "Use ComputeAngleByQuadrant" )
38  double angle_with_Dtk_dir( const Dtk_dir& V2, const Dtk_dir& ref_Z );
40 
41  void reverse();
42 
43  inline Dtk_dir operator* ( double a ) const { return Dtk_dir( _Coords[ 0 ] * a, _Coords[ 1 ] * a, _Coords[ 2 ] * a ); }
44  friend Dtk_dir operator* ( double, const Dtk_dir& );
45  friend Dtk_dir operator/ ( const Dtk_dir&, double );
46  friend Dtk_dir operator/ ( double, const Dtk_dir& );
47 
48  inline Dtk_dir operator+( const Dtk_dir& v ) { return Dtk_dir( _Coords[ 0 ] + v._Coords[ 0 ], _Coords[ 1 ] + v._Coords[ 1 ], _Coords[ 2 ] + v._Coords[ 2 ] ); }
49  inline Dtk_dir operator-( const Dtk_dir& v ) { return Dtk_dir( _Coords[ 0 ] - v._Coords[ 0 ], _Coords[ 1 ] - v._Coords[ 1 ], _Coords[ 2 ] - v._Coords[ 2 ] ); }
50 
51  friend double operator* ( const Dtk_dir&, const Dtk_dir& ); // scalar product - produit scalaire
52  friend Dtk_dir operator/ ( const Dtk_dir&, const Dtk_dir& ); // vector product - produit vectoriel
53  friend Dtk_dir operator^ ( const Dtk_dir&, const Dtk_dir& ); // vector product - produit vectoriel
54  friend double Pdtk_DotProduct( const Dtk_dir&, const Dtk_dir& ); //
55  friend Dtk_dir Pdtk_CrossProduct( const Dtk_dir&, const Dtk_dir& ); //
56 
57  friend Dtk_dir Orthogonal( const Dtk_dir& ); // trouve un vecteur orthogonal
58  friend double norm( const Dtk_dir& ); // norme
59  friend double normC( const Dtk_dir& ); // norme carree
60 
61  friend std::ostream& operator<<( std::ostream& o, const Dtk_dir& d );
62 
63  // gestion vecteurs 2D.
64  friend Dtk_pnt intersect2d( const Dtk_pnt& p1, const Dtk_dir& d1, const Dtk_pnt& p2, const Dtk_dir& d2 );
65  friend Dtk_pnt orthoproj2d( const Dtk_pnt& p1, const Dtk_dir& d1, const Dtk_pnt& p2 );
66  friend int onleft( const Dtk_dir&, const Dtk_dir& );
71  inline double& operator[] ( Dtk_Size_t i )
72  {
73  Pdtk_Assert( i < 3 );
74  return _Coords[ i ];
75  }
81  inline const double& operator[] ( Dtk_Size_t i ) const
82  {
83  Pdtk_Assert( i < 3 );
84  return _Coords[ i ];
85  }
86 
88  inline double & x() { return _Coords[ 0 ]; }
89 
92  inline const double & x() const { return _Coords[ 0 ]; }
93 
95  inline double & y() { return _Coords[ 1 ]; }
96 
99  inline const double & y() const { return _Coords[ 1 ]; }
100 
102  inline double & z() { return _Coords[ 2 ]; }
103 
106  inline const double & z() const { return _Coords[ 2 ]; }
107 
108 
109  void Cross( const Dtk_dir& right );
110  Dtk_dir Crossed( const Dtk_dir& right ) const;
111  inline void operator ^= ( const Dtk_dir& right );
112  void CrossCross( const Dtk_dir& c1, const Dtk_dir& c2 );
113  Dtk_dir CrossCrossed( const Dtk_dir& c1, const Dtk_dir& c2 ) const;
114 
115  double SquareModulus();
117  double Normalize();
119  Dtk_dir reversed() const;
120 
121  inline double Dot( const Dtk_dir& other ) const { return ( *this * other ); }
122  inline double operator & ( const Dtk_dir& other ) const { return ( *this * other ); }
123 
124  double DotCross( const Dtk_dir& c1, const Dtk_dir& c2 ) const;
125 
126  void Multiply( const CDtk_3dMat& matrix );
127  inline void operator *= ( const CDtk_3dMat& matrix );
128  Dtk_dir Multiplied( const CDtk_3dMat& matrix ) const;
129  inline Dtk_dir operator * ( const CDtk_3dMat& matrix ) const;
130  void MultiplyNormalize( const CDtk_3dMat& matrix );
131  Dtk_dir MultipliedNormalize( const CDtk_3dMat& matrix ) const;
132  void PostMultiply( const CDtk_3dMat& matrix );
133  Dtk_dir PostMultiplied( const CDtk_3dMat& matrix ) const;
134  void MultiplyByTransposed( const CDtk_3dMat& matrix );
135  Dtk_dir MultipliedByTransposed( const CDtk_3dMat& matrix ) const;
136  double AngleXY( double tolerance = 0.00000001 ) const;
137  double Angle( const Dtk_dir& vRef, const Dtk_dir& vAxe, double tolerance = 0.00000001 ) const;
138 
139  void Scale( const Dtk_pnt& p0, double s );
140  Dtk_dir Scaled( const Dtk_pnt& p0, double s ) const;
141  void Translate( const Dtk_dir& dir );
142  Dtk_dir Translated( const Dtk_dir& dir ) const;
143  void Translate( const Dtk_pnt& p0, const Dtk_pnt& p1 );
144  Dtk_dir Translated( const Dtk_pnt& p0, const Dtk_pnt& p1 ) const;
145  void Transform( const CDtk_3dMat& matrix );
146  Dtk_dir Transformed( const CDtk_3dMat& matrix ) const;
147  void Rotate( const Dtk_pnt& p0, const CDtk_3dMat& matrix );
148  Dtk_dir Rotated( const Dtk_pnt& p0, const CDtk_3dMat& matrix ) const;
149  void Rotate( const Dtk_dir& dir, double angle, const Dtk_pnt& center );
150  Dtk_dir Rotated( const Dtk_dir& dir, double angle, const Dtk_pnt& center ) const;
151  void Symetry( const Dtk_dir& zpl );
152  void Symetry( const Dtk_pnt& opl, const Dtk_dir& zpl );
153  Dtk_dir Symetrised( const Dtk_pnt& opl, const Dtk_dir& zpl ) const;
154  void Affinity( const Dtk_pnt&, const Dtk_dir& xdir, const Dtk_dir& ydir, double[ 3 ] );
155  inline void Affinity( double f[ 3 ] ) { _Coords[ 0 ] *= f[ 0 ]; _Coords[ 1 ] *= f[ 1 ]; _Coords[ 2 ] *= f[ 2 ]; }
156  Dtk_dir Affinitised( const Dtk_pnt& p, const Dtk_dir& xdir, const Dtk_dir& ydir, double f[ 3 ] ) const;
157 
158 
159  Dtk_dir UnitizedDerivative( const Dtk_dir& thisPrime ) const;
160  Dtk_dir UnitizedSecondDerivative( const Dtk_dir& thisPrime, const Dtk_dir& thisSecond ) const;
161  Dtk_dir DerivativeOfCrossProduct( const Dtk_dir& other, const Dtk_dir& thisPrime, const Dtk_dir& otherPrime ) const;
162  Dtk_dir SecondDerivativeOfCrossProduct( const Dtk_dir& other, const Dtk_dir& thisPrime, const Dtk_dir& otherPrime, const Dtk_dir& thisSecond, const Dtk_dir& otherSecond ) const;
163  double DerivativeOfNorm( const Dtk_dir& thisPrime ) const;
164  double SecondDerivativeOfNorm( const Dtk_dir& thisPrime, const Dtk_dir& thisSecond ) const;
165 };
166 
167 
168 inline void Dtk_dir::operator *= ( const CDtk_3dMat& matrix )
169 {
170  Multiply( matrix );
171 }
172 
173 inline Dtk_dir Dtk_dir::operator * ( const CDtk_3dMat& matrix ) const
174 {
175  return Multiplied( matrix );
176 }
177 
178 inline void Dtk_dir::operator ^= ( const Dtk_dir& right )
179 {
180  Cross( right );
181 }
182 
183 
184 #endif
Dtk_dir::DotCross
double DotCross(const Dtk_dir &c1, const Dtk_dir &c2) const
Dtk_dir::operator=
Dtk_dir & operator=(const Dtk_dir &)
Dtk_dir::operator-
Dtk_dir operator-() const
Dtk_dir::operator/
friend Dtk_dir operator/(const Dtk_dir &, double)
Dtk_dir::Pdtk_DotProduct
friend double Pdtk_DotProduct(const Dtk_dir &, const Dtk_dir &)
Dtk_dir::norm
double norm() const
Dtk_dir::y
const double & y() const
access to y coordinate of the Dtk_pnt.
Definition: dtk_dir.hpp:99
Dtk_dir::SecondDerivativeOfNorm
double SecondDerivativeOfNorm(const Dtk_dir &thisPrime, const Dtk_dir &thisSecond) const
Dtk_dir::Dtk_dir
Dtk_dir(const Dtk_pnt &pnt)
Dtk_dir::GetNormal
Dtk_dir GetNormal() const
Dtk_dir::y
double & y()
access to y coordinate of the Dtk_pnt.
Definition: dtk_dir.hpp:95
Dtk_dir::MultiplyByTransposed
void MultiplyByTransposed(const CDtk_3dMat &matrix)
Dtk_dir::Pdtk_CrossProduct
friend Dtk_dir Pdtk_CrossProduct(const Dtk_dir &, const Dtk_dir &)
Dtk_dir::ComputeAngleByQuadrant
Dtk_Double64 ComputeAngleByQuadrant(const Dtk_dir &V2, const Dtk_dir &ref_Z) const
Dtk_dir::Affinitised
Dtk_dir Affinitised(const Dtk_pnt &p, const Dtk_dir &xdir, const Dtk_dir &ydir, double f[3]) const
Dtk_dir::Affinity
void Affinity(const Dtk_pnt &, const Dtk_dir &xdir, const Dtk_dir &ydir, double[3])
Dtk_dir::Rotated
Dtk_dir Rotated(const Dtk_pnt &p0, const CDtk_3dMat &matrix) const
Dtk_dir::operator&
double operator&(const Dtk_dir &other) const
Definition: dtk_dir.hpp:122
Dtk_dir::onleft
friend int onleft(const Dtk_dir &, const Dtk_dir &)
Dtk_Size_t
size_t Dtk_Size_t
Definition: define.h:714
Dtk_dir::Dtk_dir
Dtk_dir()
Dtk_dir::CrossCross
void CrossCross(const Dtk_dir &c1, const Dtk_dir &c2)
Dtk_dir::reverse
void reverse()
Dtk_dir::operator/=
Dtk_dir & operator/=(double)
Dtk_dir::DerivativeOfCrossProduct
Dtk_dir DerivativeOfCrossProduct(const Dtk_dir &other, const Dtk_dir &thisPrime, const Dtk_dir &otherPrime) const
Dtk_dir::Scale
void Scale(const Dtk_pnt &p0, double s)
Dtk_dir::operator+=
Dtk_dir & operator+=(const Dtk_dir &)
Dtk_dir::operator*=
Dtk_dir & operator*=(double)
Dtk_Double64
double Dtk_Double64
Definition: define.h:701
Dtk_dir::Orthogonal
friend Dtk_dir Orthogonal(const Dtk_dir &)
Dtk_dir::SetAsDeprecated
SetAsDeprecated("Undefined", "Use ComputeAngleByQuadrant") double angle_with_Dtk_dir(const Dtk_dir &V2
Dtk_dir::operator-=
Dtk_dir & operator-=(const Dtk_dir &)
Dtk_dir::operator<<
friend std::ostream & operator<<(std::ostream &o, const Dtk_dir &d)
Dtk_dir::PostMultiplied
Dtk_dir PostMultiplied(const CDtk_3dMat &matrix) const
dtk_pnt.hpp
Dtk_dir::normC
friend double normC(const Dtk_dir &)
Pdtk_Assert
#define Pdtk_Assert(X)
Definition: define.h:745
Dtk_dir::Affinity
void Affinity(double f[3])
Definition: dtk_dir.hpp:155
Dtk_dir::SquareModulus
double SquareModulus()
Dtk_dir::Symetry
void Symetry(const Dtk_dir &zpl)
Dtk_dir::Multiplied
Dtk_dir Multiplied(const CDtk_3dMat &matrix) const
Dtk_dir::Angle
double Angle(const Dtk_dir &vRef, const Dtk_dir &vAxe, double tolerance=0.00000001) const
Dtk_dir::operator+=
Dtk_dir & operator+=(const Dtk_pnt &)
Dtk_dir::Crossed
Dtk_dir Crossed(const Dtk_dir &right) const
Dtk_dir::Dtk_dir
Dtk_dir(const Dtk_pnt &, const Dtk_pnt &)
Dtk_dir::ref_Z
const Dtk_dir & ref_Z
Definition: dtk_dir.hpp:38
Dtk_dir::operator-
Dtk_dir operator-(const Dtk_dir &v)
Definition: dtk_dir.hpp:49
Dtk_dir::Cross
void Cross(const Dtk_dir &right)
Dtk_dir::operator[]
double & operator[](Dtk_Size_t i)
access to a specified coordinate of the Dtk_pnt
Definition: dtk_dir.hpp:71
Dtk_dir::orthoproj2d
friend Dtk_pnt orthoproj2d(const Dtk_pnt &p1, const Dtk_dir &d1, const Dtk_pnt &p2)
Dtk_dir::DerivativeOfNorm
double DerivativeOfNorm(const Dtk_dir &thisPrime) const
Dtk_dir::Normalized
Dtk_dir Normalized() const
Dtk_dir::Transform
void Transform(const CDtk_3dMat &matrix)
Dtk_dir::Dot
double Dot(const Dtk_dir &other) const
Definition: dtk_dir.hpp:121
Dtk_dir::PostMultiply
void PostMultiply(const CDtk_3dMat &matrix)
Dtk_dir::SecondDerivativeOfCrossProduct
Dtk_dir SecondDerivativeOfCrossProduct(const Dtk_dir &other, const Dtk_dir &thisPrime, const Dtk_dir &otherPrime, const Dtk_dir &thisSecond, const Dtk_dir &otherSecond) const
Dtk_dir::operator^
friend Dtk_dir operator^(const Dtk_dir &, const Dtk_dir &)
Dtk_dir::MultipliedByTransposed
Dtk_dir MultipliedByTransposed(const CDtk_3dMat &matrix) const
Dtk_dir::normalize
int normalize()
Dtk_dir::intersect2d
friend Dtk_pnt intersect2d(const Dtk_pnt &p1, const Dtk_dir &d1, const Dtk_pnt &p2, const Dtk_dir &d2)
Dtk_dir::operator+
Dtk_dir operator+() const
Dtk_pnt
This is a mathematical point class.
Definition: dtk_pnt.hpp:22
Dtk_dir::AngleXY
double AngleXY(double tolerance=0.00000001) const
Dtk_dir::Dtk_dir
Dtk_dir(const Dtk_dir &s)
define.h
Dtk_dir::Translate
void Translate(const Dtk_pnt &p0, const Dtk_pnt &p1)
Dtk_dir::z
const double & z() const
access to z coordinate of the Dtk_pnt.
Definition: dtk_dir.hpp:106
Dtk_dir::operator^=
void operator^=(const Dtk_dir &right)
Definition: dtk_dir.hpp:178
Dtk_dir::~Dtk_dir
~Dtk_dir()
Definition: dtk_dir.hpp:18
Dtk_dir::operator+
Dtk_dir operator+(const Dtk_dir &v)
Definition: dtk_dir.hpp:48
Dtk_dir::x
double & x()
access to x coordinate of the Dtk_pnt.
Definition: dtk_dir.hpp:88
Dtk_dir::rotate
int rotate(const Dtk_dir &Z, double angle)
Dtk_dir::UnitizedDerivative
Dtk_dir UnitizedDerivative(const Dtk_dir &thisPrime) const
Dtk_dir::Rotate
void Rotate(const Dtk_dir &dir, double angle, const Dtk_pnt &center)
Dtk_dir::norm
friend double norm(const Dtk_dir &)
Dtk_dir::Translated
Dtk_dir Translated(const Dtk_pnt &p0, const Dtk_pnt &p1) const
Dtk_dir::x
const double & x() const
access to x coordinate of the Dtk_pnt.
Definition: dtk_dir.hpp:92
Dtk_dir::Normalize
double Normalize()
Dtk_dir::Rotated
Dtk_dir Rotated(const Dtk_dir &dir, double angle, const Dtk_pnt &center) const
Dtk_dir::Rotate
void Rotate(const Dtk_pnt &p0, const CDtk_3dMat &matrix)
Dtk_dir::Multiply
void Multiply(const CDtk_3dMat &matrix)
Dtk_dir::operator-=
Dtk_dir & operator-=(const Dtk_pnt &)
Dtk_dir::reversed
Dtk_dir reversed() const
Dtk_dir::operator*
Dtk_dir operator*(double a) const
Definition: dtk_dir.hpp:43
Dtk_dir::Translated
Dtk_dir Translated(const Dtk_dir &dir) const
Dtk_pnt::_Coords
double _Coords[3]
Definition: dtk_pnt.hpp:24
Dtk_dir::Transformed
Dtk_dir Transformed(const CDtk_3dMat &matrix) const
Dtk_dir
This is a mathematical direction class.
Definition: dtk_dir.hpp:15
Dtk_dir::Symetrised
Dtk_dir Symetrised(const Dtk_pnt &opl, const Dtk_dir &zpl) const
Dtk_dir::MultipliedNormalize
Dtk_dir MultipliedNormalize(const CDtk_3dMat &matrix) const
Dtk_dir::Symetry
void Symetry(const Dtk_pnt &opl, const Dtk_dir &zpl)
Dtk_dir::UnitizedSecondDerivative
Dtk_dir UnitizedSecondDerivative(const Dtk_dir &thisPrime, const Dtk_dir &thisSecond) const
Dtk_dir::Scaled
Dtk_dir Scaled(const Dtk_pnt &p0, double s) const
Dtk_dir::Dtk_dir
Dtk_dir(double a, double b, double c=0.0)
Dtk_dir::MultiplyNormalize
void MultiplyNormalize(const CDtk_3dMat &matrix)
Dtk_dir::Translate
void Translate(const Dtk_dir &dir)
Dtk_dir::CrossCrossed
Dtk_dir CrossCrossed(const Dtk_dir &c1, const Dtk_dir &c2) const
Dtk_dir::z
double & z()
access to z coordinate of the Dtk_pnt.
Definition: dtk_dir.hpp:102