DATAKIT API  V2025.1
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  //deprecated
36  SetAsDeprecated( "Undefined", "Use ComputeAngleByQuadrant" )
37  double angle_with_Dtk_dir( const Dtk_dir& V2, const Dtk_dir& ref_Z );
39 
40  void reverse();
41 
42  inline Dtk_dir operator* ( double a ) const { return Dtk_dir( _Coords[ 0 ] * a, _Coords[ 1 ] * a, _Coords[ 2 ] * a ); }
43  friend Dtk_dir operator* ( double, const Dtk_dir& );
44  friend Dtk_dir operator/ ( const Dtk_dir&, double );
45  friend Dtk_dir operator/ ( double, const Dtk_dir& );
46 
47  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 ] ); }
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 
50  friend double operator* ( const Dtk_dir&, const Dtk_dir& ); // scalar product - produit scalaire
51  friend Dtk_dir operator/ ( const Dtk_dir&, const Dtk_dir& ); // vector product - produit vectoriel
52  friend Dtk_dir operator^ ( const Dtk_dir&, const Dtk_dir& ); // vector product - produit vectoriel
53  friend double Pdtk_DotProduct( const Dtk_dir&, const Dtk_dir& ); //
54  friend Dtk_dir Pdtk_CrossProduct( const Dtk_dir&, const Dtk_dir& ); //
55 
56  friend Dtk_dir Orthogonal( const Dtk_dir& ); // trouve un vecteur orthogonal
57  friend double norm( const Dtk_dir& ); // norme
58  friend double normC( const Dtk_dir& ); // norme carree
59 
60  friend std::ostream& operator<<( std::ostream& o, const Dtk_dir& d );
61 
62  // gestion vecteurs 2D.
63  friend Dtk_pnt intersect2d( const Dtk_pnt& p1, const Dtk_dir& d1, const Dtk_pnt& p2, const Dtk_dir& d2 );
64  friend Dtk_pnt orthoproj2d( const Dtk_pnt& p1, const Dtk_dir& d1, const Dtk_pnt& p2 );
65  friend int onleft( const Dtk_dir&, const Dtk_dir& );
70  inline double& operator[] ( Dtk_Size_t i )
71  {
72  Pdtk_Assert( i < 3 );
73  return _Coords[ i ];
74  }
80  inline const double& operator[] ( Dtk_Size_t i ) const
81  {
82  Pdtk_Assert( i < 3 );
83  return _Coords[ i ];
84  }
85 
87  inline double & x() { return _Coords[ 0 ]; }
88 
91  inline const double & x() const { return _Coords[ 0 ]; }
92 
94  inline double & y() { return _Coords[ 1 ]; }
95 
98  inline const double & y() const { return _Coords[ 1 ]; }
99 
101  inline double & z() { return _Coords[ 2 ]; }
102 
105  inline const double & z() const { return _Coords[ 2 ]; }
106 
107 
108  void Cross( const Dtk_dir& right );
109  Dtk_dir Crossed( const Dtk_dir& right ) const;
110  inline void operator ^= ( const Dtk_dir& right );
111  void CrossCross( const Dtk_dir& c1, const Dtk_dir& c2 );
112  Dtk_dir CrossCrossed( const Dtk_dir& c1, const Dtk_dir& c2 ) const;
113 
114  double SquareModulus();
116  double Normalize();
118  Dtk_dir reversed() const;
119 
120  inline double Dot( const Dtk_dir& other ) const { return ( *this * other ); }
121  inline double operator & ( const Dtk_dir& other ) const { return ( *this * other ); }
122 
123  double DotCross( const Dtk_dir& c1, const Dtk_dir& c2 ) const;
124 
125  void Multiply( const CDtk_3dMat& matrix );
126  inline void operator *= ( const CDtk_3dMat& matrix );
127  Dtk_dir Multiplied( const CDtk_3dMat& matrix ) const;
128  inline Dtk_dir operator * ( const CDtk_3dMat& matrix ) const;
129  void MultiplyNormalize( const CDtk_3dMat& matrix );
130  Dtk_dir MultipliedNormalize( const CDtk_3dMat& matrix ) const;
131  void PostMultiply( const CDtk_3dMat& matrix );
132  Dtk_dir PostMultiplied( const CDtk_3dMat& matrix ) const;
133  void MultiplyByTransposed( const CDtk_3dMat& matrix );
134  Dtk_dir MultipliedByTransposed( const CDtk_3dMat& matrix ) const;
135  double AngleXY( double tolerance = 0.00000001 ) const;
136  double Angle( const Dtk_dir& vRef, const Dtk_dir& vAxe, double tolerance = 0.00000001 ) const;
137 
138  void Scale( const Dtk_pnt& p0, double s );
139  Dtk_dir Scaled( const Dtk_pnt& p0, double s ) const;
140  void Translate( const Dtk_dir& dir );
141  Dtk_dir Translated( const Dtk_dir& dir ) const;
142  void Translate( const Dtk_pnt& p0, const Dtk_pnt& p1 );
143  Dtk_dir Translated( const Dtk_pnt& p0, const Dtk_pnt& p1 ) const;
144  void Transform( const CDtk_3dMat& matrix );
145  Dtk_dir Transformed( const CDtk_3dMat& matrix ) const;
146  void Rotate( const Dtk_pnt& p0, const CDtk_3dMat& matrix );
147  Dtk_dir Rotated( const Dtk_pnt& p0, const CDtk_3dMat& matrix ) const;
148  void Rotate( const Dtk_dir& dir, double angle, const Dtk_pnt& center );
149  Dtk_dir Rotated( const Dtk_dir& dir, double angle, const Dtk_pnt& center ) const;
150  void Symetry( const Dtk_dir& zpl );
151  void Symetry( const Dtk_pnt& opl, const Dtk_dir& zpl );
152  Dtk_dir Symetrised( const Dtk_pnt& opl, const Dtk_dir& zpl ) const;
153  void Affinity( const Dtk_pnt&, const Dtk_dir& xdir, const Dtk_dir& ydir, double[ 3 ] );
154  inline void Affinity( double f[ 3 ] ) { _Coords[ 0 ] *= f[ 0 ]; _Coords[ 1 ] *= f[ 1 ]; _Coords[ 2 ] *= f[ 2 ]; }
155  Dtk_dir Affinitised( const Dtk_pnt& p, const Dtk_dir& xdir, const Dtk_dir& ydir, double f[ 3 ] ) const;
156 
157 
158  Dtk_dir UnitizedDerivative( const Dtk_dir& thisPrime ) const;
159  Dtk_dir UnitizedSecondDerivative( const Dtk_dir& thisPrime, const Dtk_dir& thisSecond ) const;
160  Dtk_dir DerivativeOfCrossProduct( const Dtk_dir& other, const Dtk_dir& thisPrime, const Dtk_dir& otherPrime ) const;
161  Dtk_dir SecondDerivativeOfCrossProduct( const Dtk_dir& other, const Dtk_dir& thisPrime, const Dtk_dir& otherPrime, const Dtk_dir& thisSecond, const Dtk_dir& otherSecond ) const;
162  double DerivativeOfNorm( const Dtk_dir& thisPrime ) const;
163  double SecondDerivativeOfNorm( const Dtk_dir& thisPrime, const Dtk_dir& thisSecond ) const;
164 };
165 
166 
167 inline void Dtk_dir::operator *= ( const CDtk_3dMat& matrix )
168 {
169  Multiply( matrix );
170 }
171 
172 inline Dtk_dir Dtk_dir::operator * ( const CDtk_3dMat& matrix ) const
173 {
174  return Multiplied( matrix );
175 }
176 
177 inline void Dtk_dir::operator ^= ( const Dtk_dir& right )
178 {
179  Cross( right );
180 }
181 
182 
183 #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:98
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:94
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:121
Dtk_dir::onleft
friend int onleft(const Dtk_dir &, const Dtk_dir &)
Dtk_Size_t
size_t Dtk_Size_t
Definition: define.h:712
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:699
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:742
Dtk_dir::Affinity
void Affinity(double f[3])
Definition: dtk_dir.hpp:154
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:37
Dtk_dir::operator-
Dtk_dir operator-(const Dtk_dir &v)
Definition: dtk_dir.hpp:48
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:70
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:120
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:105
Dtk_dir::operator^=
void operator^=(const Dtk_dir &right)
Definition: dtk_dir.hpp:177
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:47
Dtk_dir::x
double & x()
access to x coordinate of the Dtk_pnt.
Definition: dtk_dir.hpp:87
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:91
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:42
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:101