Gray C++ Libraries  0.0.2
A set of C++ libraries for MSVC, GNU on Windows, WinCE, Linux
cSegment3.h
Go to the documentation of this file.
1 //
4 //
5 
6 #ifndef _INC_cSegment3_H
7 #define _INC_cSegment3_H
8 #ifndef NO_PRAGMA_ONCE
9 #pragma once
10 #endif
11 
12 #include "../Math/cVector.h"
13 
14 namespace GrayLib
15 {
16  UNITTEST2_PREDEF(cSegment3);
17  class cVariant;
18 
20  {
25 
26  public:
27  typedef float DVALUE_t;
30 
31  public:
32  cSegment3f() noexcept
33  {
35  }
36 
37  cSegment3f(const cVector3f& v1, const cVector3f& v2) noexcept
38  : m_vMin(v1), m_vMax(v2)
39  {}
40 
41  // Get operators.
42  cVector3f get_Center() const noexcept
43  {
45  return cVector3f((m_vMin.x + m_vMax.x) / 2, (m_vMin.y + m_vMax.y) / 2, (m_vMin.z + m_vMax.z) / 2);
46  }
47  DVALUE_t get_Width() const noexcept
48  {
49  return m_vMax.x - m_vMin.x;
50  }
51  DVALUE_t get_Height() const noexcept
52  {
53  return m_vMax.y - m_vMin.y;
54  }
55  DVALUE_t get_HeightMax() const noexcept
56  {
57  return m_vMax.y;
58  }
59  DVALUE_t get_Depth() const noexcept
60  {
61  return m_vMax.z - m_vMin.z;
62  }
63  cVector3f get_Delta() const noexcept
64  {
66  return cVector3f(m_vMax.x - m_vMin.x, m_vMax.y - m_vMin.y, m_vMax.z - m_vMin.z);
67  }
68  enum AXIS_TYPE get_LargestAxis() const noexcept
69  {
70  const cVector3f s = get_Delta();
71  if ((s.x >= s.y) && (s.x >= s.z))
72  return AXIS_TYPE::AXIS_X;
73  if ((s.y >= s.x) && (s.y >= s.z))
74  return AXIS_TYPE::AXIS_Y;
75  return AXIS_TYPE::AXIS_Z;
76  }
77  DVALUE_t get_MaxDelta() const noexcept
78  {
79  const cVector3f v = get_Delta();
80  return Calc::Max3(v.x, v.y, v.z);
81  }
82 
84  {
87  return get_Delta().get_Magnitude();
88  }
90  {
92  return get_Diameter() / 2.0f;
93  }
94 
96  {
97  // Get the shortest distance from a point to line.
98  // the length of the line segment that is perpendicular to the line and passes through the point.
99  // https://en.wikipedia.org/wiki/Distance_from_a_point_to_a_line
100  // https://brilliant.org/wiki/dot-product-distance-between-point-and-a-line/
101  // https://codereview.stackexchange.com/questions/143424/c-code-to-find-distance-between-line-and-point
102  // AKA Dot Product ??
103 
104  const cVector3f AB = get_Delta();
105  const cVector3f AC = v - m_vMin;
106  const DVALUE_t norm = AB.get_Magnitude();
107  const DVALUE_t area = ((AB.m_x * AC.m_y) - (AB.m_y * AC.m_x)); // (int)
108  return Calc::Abs(area / norm);
109  }
110 
111  bool operator == (const cSegment3f& line) const
112  {
113  return(line.m_vMin == m_vMin && line.m_vMax == m_vMax);
114  }
115  inline operator const DVALUE_t* () const noexcept
116  {
117  return &m_vMin.m_a[0];
118  }
119  inline operator DVALUE_t* () noexcept
120  {
121  return &m_vMin.m_a[0];
122  }
123 
124  // Init operators.
125  void SetMin() noexcept
126  {
128  m_vMin = cVector3f(k_FLT_MAX2, k_FLT_MAX2, k_FLT_MAX2);
129  m_vMax = cVector3f(-k_FLT_MAX2, -k_FLT_MAX2, -k_FLT_MAX2);
130  }
131  void SetMax() noexcept
132  {
134  m_vMin = cVector3f(-k_FLT_MAX2, -k_FLT_MAX2, -k_FLT_MAX2);
135  m_vMax = cVector3f(k_FLT_MAX2, k_FLT_MAX2, k_FLT_MAX2);
136  }
137  void SetOne() noexcept
138  {
139  m_vMin = cVector3f(-0.5f, -0.5f, -0.5f);
140  m_vMax = cVector3f(0.5f, 0.5f, 0.5f);
141  }
142  void SetZero() noexcept
143  {
144  cMem::Zero(&m_vMin, sizeof(m_vMin) * 2);
145  }
146  void SetRay(const cVector3f& vOrigin, const cVector3f& vDir, DVALUE_t fDist)
147  {
150  m_vMin = vOrigin;
151  m_vMax = vDir;
152  m_vMax.put_Magnitude(fDist);
153  m_vMax += vOrigin;
154  }
155 
157 
158  void Scale(DVALUE_t fScale)
159  {
161  ASSERT(fScale > 0);
162  m_vMin *= fScale;
163  m_vMax *= fScale;
164  }
165  void ScaleVect(const cVector3f& vScale)
166  {
167  // ASSERT( scale > 0 );
168  m_vMin *= vScale;
169  m_vMax *= vScale;
170  }
171  void ScaleY(DVALUE_t fScaleY)
172  {
174  ASSERT(fScaleY > 0);
175  m_vMin.y *= fScaleY;
176  m_vMax.y *= fScaleY;
177  }
178 
179  void Offset(const cVector3f& vOffset)
180  {
181  m_vMin += vOffset;
182  m_vMax += vOffset;
183  }
184  void Grow(const cVector3f& vOffset)
185  {
186  m_vMin -= vOffset;
187  m_vMax += vOffset;
188  }
189  void GrowN(DVALUE_t nValue)
190  {
191  m_vMin -= nValue;
192  m_vMax += nValue;
193  }
194 
195  // Serialize.
196 
197  ITERATE_t v_SetLine(const cVariant& vArgs, ITERATE_t i = 0);
198  void v_GetLine(cVariant& vArgs) const;
199 
200  // ITERATE_t v_SetLineRev( const cVariant& vArgs, ITERATE_t i=0 );
201  // void v_GetLineRev( cVariant& vArgs ) const;
202 
203  UNITTEST_FRIEND(cSegment3);
204  };
205 }
206 #endif
#define GRAYLIB_LINK
Definition: GrayLibBase.h:35
#define ASSERT(exp)
Definition: cDebugAssert.h:87
Definition: cSegment3.h:20
void Scale(DVALUE_t fScale)
Change operators.
Definition: cSegment3.h:158
DVALUE_t get_MaxDelta() const noexcept
Definition: cSegment3.h:77
DVALUE_t get_Height() const noexcept
Definition: cSegment3.h:51
cSegment3f() noexcept
Definition: cSegment3.h:32
DVALUE_t get_Depth() const noexcept
Definition: cSegment3.h:59
void GrowN(DVALUE_t nValue)
Definition: cSegment3.h:189
UNITTEST_FRIEND(cSegment3)
DVALUE_t get_HeightMax() const noexcept
Definition: cSegment3.h:55
DVALUE_t get_Width() const noexcept
Definition: cSegment3.h:47
cSegment3f(const cVector3f &v1, const cVector3f &v2) noexcept
Definition: cSegment3.h:37
void Offset(const cVector3f &vOffset)
Definition: cSegment3.h:179
void SetRay(const cVector3f &vOrigin, const cVector3f &vDir, DVALUE_t fDist)
Definition: cSegment3.h:146
void Grow(const cVector3f &vOffset)
Definition: cSegment3.h:184
void SetOne() noexcept
Definition: cSegment3.h:137
DVALUE_t get_Radius() const
Definition: cSegment3.h:89
float DVALUE_t
Dimension value type.
Definition: cSegment3.h:27
void SetZero() noexcept
Definition: cSegment3.h:142
cVector3f m_vMin
a vertex on the line segment
Definition: cSegment3.h:28
cVector3f get_Center() const noexcept
Definition: cSegment3.h:42
void SetMax() noexcept
Definition: cSegment3.h:131
cVector3f m_vMax
Definition: cSegment3.h:29
void SetMin() noexcept
Definition: cSegment3.h:125
DVALUE_t GetDistanceTo(const cVector3f &v) const
Definition: cSegment3.h:95
void ScaleVect(const cVector3f &vScale)
Definition: cSegment3.h:165
DVALUE_t get_Diameter() const
Definition: cSegment3.h:83
void ScaleY(DVALUE_t fScaleY)
Definition: cSegment3.h:171
cVector3f get_Delta() const noexcept
Definition: cSegment3.h:63
Definition: cVariant.h:26
TYPE m_a[k_nDim]
Definition: cVecT.h:543
TYPE y
Definition: cVecT.h:545
TYPE z
Definition: cVecT.h:545
TYPE m_x
Definition: cVecT.h:544
TYPE m_y
Definition: cVecT.h:544
TYPE x
Definition: cVecT.h:545
TYPE get_Magnitude() const noexcept
Definition: cVecT.h:129
bool put_Magnitude(TYPE nLength)
Definition: cVecT.h:350
Definition: cVector.h:94
Definition: cMesh.h:22
UNITTEST2_PREDEF(cQuadtree)
AXIS_TYPE
Definition: cVector.h:25
@ AXIS_Y
Definition: cVector.h:29
@ AXIS_X
Definition: cVector.h:28
@ AXIS_Z
Definition: cVector.h:30
int ITERATE_t
like size_t but signed
Definition: Index.h:28
bool operator==(const cTimeDouble &dt1, const cTimeDouble &dt2)
Definition: cTimeDouble.h:250
static TYPE Max3(TYPE a, TYPE b, TYPE c) noexcept
Definition: Calc.h:104
static TYPE Abs(TYPE a) noexcept
similar to ABS(n) macro. Does nothing for unsigned types.
static void Zero(void *pData, size_t nSizeBlock) noexcept
Definition: cMem.h:100