OpenLexocad  28.0
Vector3D.h
Go to the documentation of this file.
1 /***************************************************************************
2  * Copyright (c) 2005 Imetric 3D GmbH *
3  * *
4  * This file is part of the FreeCAD CAx development system. *
5  * *
6  * This library is free software; you can redistribute it and/or *
7  * modify it under the terms of the GNU Library General Public *
8  * License as published by the Free Software Foundation; either *
9  * version 2 of the License, or (at your option) any later version. *
10  * *
11  * This library is distributed in the hope that it will be useful, *
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of *
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
14  * GNU Library General Public License for more details. *
15  * *
16  * You should have received a copy of the GNU Library General Public *
17  * License along with this library; see the file COPYING.LIB. If not, *
18  * write to the Free Software Foundation, Inc., 59 Temple Place, *
19  * Suite 330, Boston, MA 02111-1307, USA *
20  * *
21  ***************************************************************************/
22 
23 
24 #pragma once
25 
26 #include <cmath>
27 #include <cfloat>
28 
29 #ifndef F_PI
30 # define F_PI 3.1415926f
31 #endif
32 
33 #ifndef D_PI
34 # define D_PI 3.141592653589793
35 #endif
36 
37 #ifndef FLOAT_MAX
38 # define FLOAT_MAX 3.402823466E+38F
39 #endif
40 
41 #ifndef FLOAT_MIN
42 # define FLOAT_MIN 1.175494351E-38F
43 #endif
44 
45 #ifndef DOUBLE_MAX
46 # define DOUBLE_MAX 1.7976931348623157E+308 /* max decimal value of a "double"*/
47 #endif
48 
49 #ifndef DOUBLE_MIN
50 # define DOUBLE_MIN 2.2250738585072014E-308 /* min decimal value of a "double"*/
51 #endif
52 
53 
54 namespace Base {
55 template <class numT>
56 struct float_traits { };
57 
58 template <>
59 struct float_traits<float> {
60  typedef float float_type;
61  static inline float_type pi() { return F_PI; }
62  static inline float_type epsilon() { return FLT_EPSILON; }
63  static inline float_type maximum() { return FLT_MAX; }
64 };
65 
66 template <>
67 struct float_traits<double> {
68  typedef double float_type;
69  static inline float_type pi() { return D_PI; }
70  static inline float_type epsilon() { return DBL_EPSILON; }
71  static inline float_type maximum() { return DBL_MAX; }
72 };
73 
75 template <class _Precision>
76 class Vector3
77 {
78 public:
79  typedef _Precision num_type;
81  static inline num_type epsilon() { return traits_type::epsilon(); }
82 
85  _Precision x;
86  _Precision y;
87  _Precision z;
89 
91  explicit Vector3 (_Precision fx = 0.0, _Precision fy = 0.0, _Precision fz = 0.0);
93  Vector3 (const Vector3<_Precision>& rcVct);
94 
97  _Precision & operator [] (unsigned short usIndex);
100  const _Precision & operator [] (unsigned short usIndex) const;
107  Vector3 operator - (void) const;
113  Vector3 operator * (_Precision fScale) const;
114  Vector3 operator / (_Precision fDiv) const;
115  Vector3 & operator *= (_Precision fScale);
116  Vector3 & operator /= (_Precision fDiv);
120  _Precision operator * (const Vector3<_Precision>& rcVct) const;
122  _Precision Dot (const Vector3<_Precision>& rcVct) const;
126  Vector3 Cross (const Vector3<_Precision>& rcVct) const;
127 
129  bool operator != (const Vector3<_Precision>& rcVct) const;
131  bool operator == (const Vector3<_Precision>& rcVct) const;
133 
135  bool IsOnLineSegment (const Vector3<_Precision>& startVct, const Vector3<_Precision>& endVct) const;
136 
139  void ScaleX (_Precision f);
140  void ScaleY (_Precision f);
141  void ScaleZ (_Precision f);
142  void Scale (_Precision fX, _Precision fY, _Precision fZ);
143  void MoveX (_Precision f);
144  void MoveY (_Precision f);
145  void MoveZ (_Precision f);
146  void Move (_Precision fX, _Precision fY, _Precision fZ);
147  void RotateX (_Precision f);
148  void RotateY (_Precision f);
149  void RotateZ (_Precision f);
151 
152  void Set (_Precision fX, _Precision fY, _Precision fZ);
153 
156  _Precision Length (void) const;
159  _Precision Sqr (void) const;
161  Vector3 & Normalize (void);
163  _Precision GetAngle (const Vector3 &rcVect) const;
168  void TransformToCoordinateSystem (const Vector3 &rclBase, const Vector3 &rclDirX, const Vector3 &rclDirY);
177  bool IsEqual(const Vector3 &rclPnt, _Precision tol) const;
179  Vector3 & ProjectToPlane (const Vector3 &rclBase, const Vector3 &rclNorm);
184  void ProjectToPlane (const Vector3 &rclBase, const Vector3 &rclNorm, Vector3 &rclProj) const;
186 
192  Vector3 & ProjectToLine (const Vector3 &rclPoint, const Vector3 &rclLine);
197  Vector3 Perpendicular(const Vector3 &rclBase, const Vector3 &rclDir) const;
202  _Precision DistanceToPlane (const Vector3 &rclBase, const Vector3 &rclNorm) const;
204  _Precision DistanceToLine (const Vector3 &rclBase, const Vector3 &rclDirect) const;
210  Vector3 DistanceToLineSegment (const Vector3& rclP1, const Vector3& rclP2) const;
212 };
213 
214 // global functions
215 
217 template <class _Precision>
218 inline _Precision Distance (const Vector3<_Precision> &v1, const Vector3<_Precision> &v2)
219 {
220  _Precision x=v1.x-v2.x, y=v1.y-v2.y, z=v1.z-v2.z;
221  return static_cast<_Precision>(sqrt((x * x) + (y * y) + (z * z)));
222 }
223 
225 template <class _Precision>
226 inline _Precision DistanceP2 (const Vector3<_Precision> &v1, const Vector3<_Precision> &v2)
227 {
228  _Precision x=v1.x-v2.x, y=v1.y-v2.y, z=v1.z-v2.z;
229  return x * x + y * y + z * z;
230 }
231 
233 template <class _Precision>
234 inline Vector3<_Precision> operator * (_Precision fFac, const Vector3<_Precision> &rcVct)
235 {
236  return Vector3<_Precision>(rcVct.x * fFac, rcVct.y * fFac, rcVct.z * fFac);
237 }
238 
239 template <class _Pr1, class _Pr2>
241 {
242  return Vector3<_Pr1>(static_cast<_Pr1>(v.x),static_cast<_Pr1>(v.y),static_cast<_Pr1>(v.z));
243 }
244 
247 
248 } // namespace Base
Base::Vector3::ProjectToPlane
void ProjectToPlane(const Vector3 &rclBase, const Vector3 &rclNorm, Vector3 &rclProj) const
Base::float_traits< float >::pi
static float_type pi()
Definition: Vector3D.h:61
Base::Vector3::DistanceToPlane
_Precision DistanceToPlane(const Vector3 &rclBase, const Vector3 &rclNorm) const
Base::Vector3::Dot
_Precision Dot(const Vector3< _Precision > &rcVct) const
Scalar product.
F_PI
#define F_PI
Definition: Vector3D.h:30
Base::Vector3::y
_Precision y
Definition: Vector3D.h:86
Base::float_traits< double >::maximum
static float_type maximum()
Definition: Vector3D.h:71
Base::Vector3::operator-
Vector3 operator-(void) const
Negative vector.
Base::Vector3::z
_Precision z
Definition: Vector3D.h:87
Base::Vector3::Vector3
Vector3(const Vector3< _Precision > &rcVct)
Construction.
Base::Vector3::operator+=
Vector3 & operator+=(const Vector3< _Precision > &rcVct)
Vector summation.
Base::DistanceP2
_Precision DistanceP2(const Vector3< _Precision > &v1, const Vector3< _Precision > &v2)
Returns the squared distance between two points.
Definition: Vector3D.h:226
Base::Vector3::traits_type
float_traits< num_type > traits_type
Definition: Vector3D.h:80
Base::Vector3::epsilon
static num_type epsilon()
Definition: Vector3D.h:81
Base::Vector3::operator&
Vector3 operator&(const Vector3< _Precision > &rcVct) const
Base::Vector3::Scale
void Scale(_Precision fX, _Precision fY, _Precision fZ)
Base::Vector3::operator/=
Vector3 & operator/=(_Precision fDiv)
Base::Vector3::RotateX
void RotateX(_Precision f)
Base::Vector3::MoveZ
void MoveZ(_Precision f)
Base::Vector3::ProjectToPlane
Vector3 & ProjectToPlane(const Vector3 &rclBase, const Vector3 &rclNorm)
Projects this point onto the plane given by the base rclBase and the normal rclNorm.
Base::float_traits< double >::epsilon
static float_type epsilon()
Definition: Vector3D.h:70
Base::Vector3::TransformToCoordinateSystem
void TransformToCoordinateSystem(const Vector3 &rclBase, const Vector3 &rclDirX, const Vector3 &rclDirY)
Base::Vector3::num_type
_Precision num_type
Definition: Vector3D.h:79
Base::Vector3::x
_Precision x
Definition: Vector3D.h:85
Base::toVector
Vector3< _Pr1 > toVector(const Vector3< _Pr2 > &v)
Definition: Vector3D.h:240
Base::Vector3::operator*=
Vector3 & operator*=(_Precision fScale)
Base::float_traits< double >::pi
static float_type pi()
Definition: Vector3D.h:69
Base::Vector3::IsEqual
bool IsEqual(const Vector3 &rclPnt, _Precision tol) const
IsEqual.
Base::Vector3::GetAngle
_Precision GetAngle(const Vector3 &rcVect) const
Get angle between both vectors. The returned value lies in the interval [0,pi].
Base::Vector3::DistanceToLine
_Precision DistanceToLine(const Vector3 &rclBase, const Vector3 &rclDirect) const
Computes the distance from this point to the line given by rclBase and rclDirect.
Base::float_traits< float >::epsilon
static float_type epsilon()
Definition: Vector3D.h:62
Base::Vector3::ScaleZ
void ScaleZ(_Precision f)
Base::float_traits
Definition: Vector3D.h:56
Base::Vector3
Definition: Vector3D.h:77
Base::Vector3::IsOnLineSegment
bool IsOnLineSegment(const Vector3< _Precision > &startVct, const Vector3< _Precision > &endVct) const
Check if Vector is on a line segment.
Base::Vector3::Sqr
_Precision Sqr(void) const
Squared length of the vector.
Base::Vector3d
Vector3< double > Vector3d
Definition: Vector3D.h:246
Base::Vector3::Cross
Vector3 Cross(const Vector3< _Precision > &rcVct) const
Cross product.
Base::Vector3::Vector3
Vector3(_Precision fx=0.0, _Precision fy=0.0, _Precision fz=0.0)
Construction.
Base::Vector3::Perpendicular
Vector3 Perpendicular(const Vector3 &rclBase, const Vector3 &rclDir) const
Base::Vector3::operator/
Vector3 operator/(_Precision fDiv) const
Base::Vector3::Normalize
Vector3 & Normalize(void)
Set length to 1.
Base::Vector3::operator=
Vector3 & operator=(const Vector3< _Precision > &rcVct)
Assignment.
Base::operator*
DualNumber operator*(DualNumber a, DualNumber b)
Definition: DualNumber.h:91
Base::Vector3::operator*
Vector3 operator*(_Precision fScale) const
Vector scaling.
Base::Vector3::operator%
Vector3 operator%(const Vector3< _Precision > &rcVct) const
Cross product.
Base::Vector3::operator[]
_Precision & operator[](unsigned short usIndex)
Returns a reference to a coordinate. usIndex must be in the range [0,2].
Base::Vector3::operator==
bool operator==(const Vector3< _Precision > &rcVct) const
Comparing for equality.
Base::Vector3::DistanceToLineSegment
Vector3 DistanceToLineSegment(const Vector3 &rclP1, const Vector3 &rclP2) const
Base::Vector3::RotateZ
void RotateZ(_Precision f)
Base::Vector3::operator+
Vector3 operator+(const Vector3< _Precision > &rcVct) const
Vector addition.
Base::Vector3::Set
void Set(_Precision fX, _Precision fY, _Precision fZ)
Base::Vector3::ProjectToLine
Vector3 & ProjectToLine(const Vector3 &rclPoint, const Vector3 &rclLine)
Projects this point onto the line given by the base rclPoint and the direction rclLine.
Base::Vector3::operator-=
Vector3 & operator-=(const Vector3< _Precision > &rcVct)
Vector subtraction.
Base::Vector3::Move
void Move(_Precision fX, _Precision fY, _Precision fZ)
Base::Vector3::ScaleX
void ScaleX(_Precision f)
Base::Vector3::operator!=
bool operator!=(const Vector3< _Precision > &rcVct) const
Comparing for inequality.
Base::float_traits< float >::maximum
static float_type maximum()
Definition: Vector3D.h:63
Base::Distance
_Precision Distance(const Vector3< _Precision > &v1, const Vector3< _Precision > &v2)
Returns the distance between two points.
Definition: Vector3D.h:218
Base::Vector3::Length
_Precision Length(void) const
Length of the vector.
Base::Vector3::ScaleY
void ScaleY(_Precision f)
Base::Vector3f
Vector3< float > Vector3f
Definition: Vector3D.h:245
Base::float_traits< float >::float_type
float float_type
Definition: Vector3D.h:60
Base::float_traits< double >::float_type
double float_type
Definition: Vector3D.h:68
Base
Definition: AbstractXMLReader.h:5
Base::Vector3::RotateY
void RotateY(_Precision f)
Base::Vector3::MoveX
void MoveX(_Precision f)
Base::Vector3::MoveY
void MoveY(_Precision f)
D_PI
#define D_PI
Definition: Vector3D.h:34