CD_SimplexEnhanced.hxx
Go to the documentation of this file.
1 inline CD_SimplexEnhanced::CD_SimplexEnhanced(const Point3 & p)
2 : CD_Simplex(p), norm1_(p.normsquared()), norm2_(0), norm3_(0), norm4_(0)
3 {
4 }
5 
6 inline CD_SimplexEnhanced::CD_SimplexEnhanced(const Point3 & p1, const Point3 & p2)
7 : CD_Simplex(p1, p2), norm1_(p1.normsquared()), norm2_(p2.normsquared()), norm3_(0), norm4_(0)
8 {
9 }
10 
11 inline CD_SimplexEnhanced::CD_SimplexEnhanced(const Point3 & p1, const Point3 & p2, const Point3 & p3)
12 : CD_Simplex(p1, p2, p3), norm1_(p1.normsquared()), norm2_(p2.normsquared()), norm3_(p3.normsquared()), norm4_(0)
13 {
14 }
15 
17  const Point3 & p2,
18  const Point3 & p3,
19  const Point3 & p4)
20 : CD_Simplex(p1, p2, p3, p4), norm1_(p1.normsquared()), norm2_(p2.normsquared()), norm3_(p3.normsquared()),
21  norm4_(p4.normsquared())
22 {
23 }
24 
25 inline Scalar & CD_SimplexEnhanced::norms(const char i)
26 {
27  return ((i == 0) ? norm1_ : (i == 1) ? norm2_ : (i == 2) ? norm3_ : norm4_);
28 }
29 
30 inline Scalar CD_SimplexEnhanced::norms(const char i) const
31 {
32  return ((i == 0) ? norm1_ : (i == 1) ? norm2_ : (i == 2) ? norm3_ : norm4_);
33 }
34 
35 inline Scalar CD_SimplexEnhanced::square_(const Scalar & a)
36 {
37  return a * a;
38 }
39 
40 inline Scalar CD_SimplexEnhanced::cube_(const Scalar & a)
41 {
42  return a * a * a;
43 }
44 
46 {
47 
48  switch(f.type)
49  {
50  case CD_None:
51  return;
52 
53  case CD_Segment:
54  {
55  type_ = CD_Segment;
56  Vector3 cache;
57  Scalar cache2;
58  char a[] = {0, 1, 2, 3};
59  char b;
60 
61  CD_SimplexExchangeTest<Vector3>(s1_, (*this)[f.b1], cache);
62  CD_SimplexExchange<Scalar>(norm1_, norms(f.b1), cache2);
63  CD_SimplexExchange<char>(a[0], a[(int)f.b1], b);
64 
65  s2_ = (*this)[a[(int)(f.b2)]];
66  norm2_ = norms(a[(int)f.b2]);
67  return;
68  }
69  case CD_Triangle:
70  {
72  Vector3 cache;
73  Scalar cache2;
74  char a[] = {0, 1, 2, 3};
75  char b;
76 
77  CD_SimplexExchangeTest<Vector3>(s1_, (*this)[f.b1], cache);
78  CD_SimplexExchange<Scalar>(norm1_, norms(f.b1), cache2);
79  CD_SimplexExchange<char>(a[0], a[(int)f.b1], b);
80 
81  CD_SimplexExchangeTest<Vector3>(s2_, (*this)[a[(int)f.b2]], cache);
82  CD_SimplexExchange<Scalar>(norm2_, norms(a[(int)f.b2]), cache2);
83  CD_SimplexExchange<char>(a[(int)a[1]], a[(int)a[(int)f.b2]], b);
84 
85  s3_ = (*this)[a[(int)f.b3]];
86  norm3_ = norms(a[(int)f.b3]);
87  return;
88  }
89  case CD_Point:
90  {
91  Vector3 cache;
92  type_ = CD_Point;
93  s1_ = (*this)[f.b1];
94  norm1_ = norms(f.b1);
95  return;
96  }
97  default:
98  {
100  Vector3 cache;
101  Scalar cache2;
102 
103  char a[] = {0, 1, 2, 3};
104  char b;
105  CD_SimplexExchangeTest<Vector3>(s1_, (*this)[f.b1], cache);
106  CD_SimplexExchange<Scalar>(norm1_, norms(f.b1), cache2);
107  CD_SimplexExchange<char>(a[0], a[(int)f.b1], b);
108 
109  CD_SimplexExchangeTest<Vector3>(s2_, (*this)[a[(int)f.b2]], cache);
110  CD_SimplexExchange<Scalar>(norm2_, norms(a[(int)f.b2]), cache2);
111  CD_SimplexExchange<char>(a[(int)a[1]], a[(int)a[(int)f.b2]], b);
112 
113  CD_SimplexExchangeTest<Vector3>(s3_, (*this)[a[(int)f.b3]], cache);
114  CD_SimplexExchange<Scalar>(norm3_, norms(a[(int)f.b3]), cache2);
115  CD_SimplexExchange<char>(a[(int)a[2]], a[(int)a[(int)f.b3]], b);
116 
117  s4_ = (*this)[a[(int)f.b4]];
118  norm4_ = norms(a[(int)f.b4]);
119  return;
120  }
121  }
122 }
123 
124 inline CD_SimplexEnhanced::CD_SimplexEnhanced(const Point3 & p, Scalar norm) : CD_Simplex(p), norm1_(norm) {}
125 
126 inline CD_SimplexEnhanced::CD_SimplexEnhanced(const Point3 & p1, const Point3 & p2, Scalar norm1, Scalar norm2)
127 : CD_Simplex(p1, p2), norm1_(norm1), norm2_(norm2)
128 {
129 }
130 
132  const Point3 & p2,
133  const Point3 & p3,
134  Scalar norm1,
135  Scalar norm2,
136  Scalar norm3)
137 : CD_Simplex(p1, p2, p3), norm1_(norm1), norm2_(norm2), norm3_(norm3)
138 {
139 }
140 
142  const Point3 & p2,
143  const Point3 & p3,
144  const Point3 & p4,
145  Scalar norm1,
146  Scalar norm2,
147  Scalar norm3,
148  Scalar norm4)
149 : CD_Simplex(p1, p2, p3, p4), norm1_(norm1), norm2_(norm2), norm3_(norm3), norm4_(norm4)
150 {
151 }
152 
154 {
155  *this = rhs;
156 }
157 
159 {
160  if(this == &s) return *this;
161 
162  type_ = s.type_;
163  switch(type_)
164  {
165 
166  case CD_Triangle:
167  s1_ = s.s1_;
168  s2_ = s.s2_;
169  s3_ = s.s3_;
170  norm1_ = s.norm1_;
171  norm2_ = s.norm2_;
172  norm3_ = s.norm3_;
173 
174  return *this;
175  case CD_Segment:
176  s1_ = s.s1_;
177  s2_ = s.s2_;
178  norm1_ = s.norm1_;
179  norm2_ = s.norm2_;
180 
181  return *this;
182  case CD_Point:
183  s1_ = s.s1_;
184  norm1_ = s.norm1_;
185 
186  return *this;
187  default:
188  s1_ = s.s1_;
189  s2_ = s.s2_;
190  s3_ = s.s3_;
191  s4_ = s.s4_;
192  norm1_ = s.norm1_;
193  norm2_ = s.norm2_;
194  norm3_ = s.norm3_;
195  norm4_ = s.norm4_;
196 
197  return *this;
198  }
199 }
200 
202 {
203 
204  switch(type_)
205  {
206  case CD_Point:
207  s2_ = p;
208  norm2_ = s2_.normsquared();
209  type_ = CD_Segment;
210  return *this;
211  case CD_Segment:
212  s3_ = p;
213  type_ = CD_Triangle;
214  norm3_ = s3_.normsquared();
215  return *this;
216  default:
217  s4_ = p;
219  norm4_ = s4_.normsquared();
220  return *this;
221  }
222  return *this;
223 }
224 
226 {
227 
228  if(type_ == CD_Point)
229  {
230  return CD_SimplexEnhanced(s1_, p);
231  }
232  else if(type_ == CD_Segment)
233  {
234  return CD_SimplexEnhanced(s1_, s2_, p);
235  }
236  else if(type_ == CD_Triangle)
237  {
238  return CD_SimplexEnhanced(s1_, s2_, s3_, p);
239  }
240  return *this;
241 }
242 
244 
245 {
246 
247  switch(type_)
248  {
249 
250  case CD_Triangle:
251  if(norm1_ > norm2_)
252  {
253  if(norm1_ > norm3_)
254  {
255  return norm1_;
256  }
257  else
258  {
259  return norm3_;
260  }
261  }
262  else
263  {
264  if(norm2_ > norm3_)
265  {
266  return norm2_;
267  }
268  else
269  {
270  return norm3_;
271  }
272  }
273 
274  case CD_Segment:
275 
276  if(norm1_ > norm2_)
277  {
278  return norm1_;
279  }
280  else
281  {
282  return norm2_;
283  }
284 
285  case CD_Point:
286  return norm1_;
287 
288  default:
289  if(norm1_ > norm2_)
290  {
291  if(norm1_ > norm3_)
292  {
293  if(norm1_ > norm4_)
294  {
295  return norm1_;
296  }
297  else
298  {
299  return norm4_;
300  }
301  }
302  else
303  {
304  if(norm3_ > norm4_)
305  {
306  return norm3_;
307  }
308  else
309  {
310  return norm4_;
311  }
312  }
313  }
314  else
315  {
316  if(norm2_ > norm3_)
317  {
318  if(norm2_ > norm4_)
319  {
320  return norm2_;
321  }
322  else
323  {
324  return norm4_;
325  }
326  }
327  else
328  {
329  if(norm3_ > norm4_)
330  {
331  return norm3_;
332  }
333  else
334  {
335  return norm4_;
336  }
337  }
338  }
339  }
340 }
341 
343 {
344  switch(type_)
345  {
346  case CD_Segment:
347  return ab_.normsquared() <= zero_ * farthestPointDistance();
348  case CD_Triangle:
349  {
350  return (ab_ ^ ac_).normsquared() <= square_(zero_ * farthestPointDistance());
351  }
352  case CD_Tetrahedron:
353  return square_(fabs(Matrix3x3(ab_, ac_, ad_).determinant())) <= cube_(zero_ * farthestPointDistance());
354  default:
355  return false;
356  }
357 }
sch::CD_SimplexEnhanced::norm3_
Scalar norm3_
Definition: CD_SimplexEnhanced.h:90
sch::CD_SimplexEnhanced
Definition: CD_SimplexEnhanced.h:10
sch::CD_Simplex::ac_
Vector3 ac_
Definition: CD_Simplex.h:125
sch::CD_SimplexEnhanced::norm4_
Scalar norm4_
Definition: CD_SimplexEnhanced.h:90
sch::CD_SimplexKeptPoints
Definition: CD_Simplex.h:27
CD_Matrix::Vector3T::normsquared
T normsquared() const
Definition: SmallVector3T.h:308
sch::CD_Simplex::ab_
Vector3 ab_
Definition: CD_Simplex.h:125
sch::CD_Triangle
@ CD_Triangle
Definition: CD_Simplex.h:19
sch::Matrix3x3
CD_Matrix::Matrix3x3T< Scalar > Matrix3x3
Definition: SCH_Types.h:27
sch::CD_SimplexEnhanced::operator+
SCH_API CD_SimplexEnhanced operator+(const Point3 &) const
Adds a point to a simplex to transform it in a higher dimemsion simplex (doesn't work with tetrahedro...
Definition: CD_SimplexEnhanced.hxx:225
sch::CD_Segment
@ CD_Segment
Definition: CD_Simplex.h:18
sch::CD_SimplexKeptPoints::b4
char b4
Definition: CD_Simplex.h:29
sch::CD_SimplexEnhanced::operator+=
SCH_API CD_SimplexEnhanced & operator+=(const Point3 &)
Adds a point to a simplex to transform it in a higher dimemsion simplex (doesn't work with tetrahedro...
Definition: CD_SimplexEnhanced.hxx:201
sch::CD_SimplexEnhanced::isAffinelyDependent
SCH_API bool isAffinelyDependent() const
Tells if the simplex is affinely dependant or not according to the static variable zero to make it wo...
Definition: CD_SimplexEnhanced.hxx:342
sch::CD_SimplexEnhanced::farthestPointDistance
SCH_API Scalar farthestPointDistance() const
gives the distance squared between the origin and the furthest simplex vertices
Definition: CD_SimplexEnhanced.hxx:243
sch::CD_Simplex::s4_
Point3 s4_
Definition: CD_Simplex.h:124
sch::CD_SimplexKeptPoints::b2
char b2
Definition: CD_Simplex.h:29
sch::CD_SimplexKeptPoints::b1
char b1
Definition: CD_Simplex.h:29
sch::CD_SimplexEnhanced::filter
virtual SCH_API void filter(const CD_SimplexKeptPoints &k)
Updates the simplex by supressing some vertexes and/or change their order according to a filter.
Definition: CD_SimplexEnhanced.hxx:45
sch::CD_Simplex::ad_
Vector3 ad_
Definition: CD_Simplex.h:125
sch::CD_SimplexEnhanced::norms
SCH_API Scalar norms(const char i) const
returns the distances of the simplex points to the origin
Definition: CD_SimplexEnhanced.hxx:30
sch::CD_SimplexEnhanced::CD_SimplexEnhanced
SCH_API CD_SimplexEnhanced(const CD_SimplexEnhanced &rhs)
Definition: CD_SimplexEnhanced.hxx:153
sch::CD_Simplex::zero_
static const Scalar zero_
Definition: CD_Simplex.h:127
sch::CD_SimplexKeptPoints::type
CD_SimplexType type
Definition: CD_Simplex.h:31
CD_Matrix::Vector3T< Scalar, false >
sch::CD_None
@ CD_None
Definition: CD_Simplex.h:21
sch::CD_Simplex::s2_
Point3 s2_
Definition: CD_Simplex.h:124
sch::CD_SimplexKeptPoints::b3
char b3
Definition: CD_Simplex.h:29
sch::CD_Simplex::s3_
Point3 s3_
Definition: CD_Simplex.h:124
sch::Scalar
double Scalar
Definition: SCH_Types.h:23
sch::CD_Simplex
Definition: CD_Simplex.h:54
sch::CD_Simplex::s1_
Point3 s1_
Definition: CD_Simplex.h:124
sch::CD_Point
@ CD_Point
Definition: CD_Simplex.h:17
sch::CD_SimplexEnhanced::norm1_
Scalar norm1_
Definition: CD_SimplexEnhanced.h:90
sch::CD_SimplexEnhanced::operator=
SCH_API CD_SimplexEnhanced & operator=(const CD_SimplexEnhanced &)
Definition: CD_SimplexEnhanced.hxx:158
sch::CD_Simplex::type_
CD_SimplexType type_
Definition: CD_Simplex.h:122
sch::CD_Tetrahedron
@ CD_Tetrahedron
Definition: CD_Simplex.h:20
sch::CD_SimplexEnhanced::norm2_
Scalar norm2_
Definition: CD_SimplexEnhanced.h:90