opensurgsim
IntervalArithmetic-inl.h
1 // This file is a part of the OpenSurgSim project.
2 // Copyright 2013, SimQuest Solutions Inc.
3 //
4 // Licensed under the Apache License, Version 2.0 (the "License");
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
7 //
8 // http://www.apache.org/licenses/LICENSE-2.0
9 //
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an "AS IS" BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
15 
16 #ifndef SURGSIM_MATH_INTERVALARITHMETIC_INL_H
17 #define SURGSIM_MATH_INTERVALARITHMETIC_INL_H
18 
19 #include "SurgSim/Math/MinMax.h"
20 
21 namespace SurgSim
22 {
23 namespace Math
24 {
25 
26 template <class T>
27 Interval<T>::Interval(): m_min(static_cast<T>(0)), m_max(static_cast<T>(0)) {}
28 
29 template <class T>
30 Interval<T>::Interval(const T& min, const T& max): m_min(min), m_max(max)
31 {
32  SURGSIM_ASSERT(min <= max) << "Incorrect order of interval bounds";
33 }
34 
35 template <class T>
36 Interval<T>::Interval(const Interval<T>& i): m_min(i.m_min), m_max(i.m_max) {}
37 
38 template <class T>
39 Interval<T>::Interval(Interval<T>&& i): m_min(static_cast<T>(0)), m_max(static_cast<T>(0))
40 {
41  m_min = i.m_min;
42  m_max = i.m_max;
43 }
44 
45 template <class T>
47 {
48  m_min = i.m_min;
49  m_max = i.m_max;
50  return *this;
51 }
52 
53 template <class T>
55 {
56  m_min = i.m_min;
57  m_max = i.m_max;
58  return *this;
59 }
60 
61 template <class T>
62 Interval<T> Interval<T>::minToMax(const T& a1, const T& a2)
63 {
64  T min, max;
65  minMax(a1, a2, &min, &max);
66  return Interval<T>(min, max);
67 }
68 
69 template <class T>
70 Interval<T> Interval<T>::minToMax(const T& a1, const T& a2, const T& a3)
71 {
72  T min, max;
73  minMax(a1, a2, a3, &min, &max);
74  return Interval<T>(min, max);
75 }
76 
77 template <class T>
78 Interval<T> Interval<T>::minToMax(const T& a1, const T& a2, const T& a3, const T& a4)
79 {
80  T min, max;
81  minMax(a1, a2, a3, a4, &min, &max);
82  return Interval<T>(min, max);
83 }
84 
85 template <class T>
87 {
88  return (m_min <= i.m_max && i.m_min <= m_max);
89 }
90 
91 template <class T>
92 bool Interval<T>::contains(const T& val) const
93 {
94  return (m_min <= val && m_max >= val);
95 }
96 
97 template <class T>
99 {
100  return contains(static_cast<T>(0));
101 }
102 
103 template <class T>
104 bool Interval<T>::isApprox(const Interval<T>& i, const T& epsilon) const
105 {
106  return (std::abs(m_min - i.m_min) <= epsilon) && (std::abs(m_max - i.m_max) <= epsilon);
107 }
108 
109 template <class T>
111 {
112  return (m_min == i.m_min && m_max == i.m_max);
113 }
114 
115 template <class T>
117 {
118  return !(this->operator==(i));
119 }
120 
121 template <class T>
123 {
124  m_min -= thickness;
125  m_max += thickness;
126  return *this;
127 }
128 
129 template <class T>
131 {
132  if (x < m_min)
133  {
134  m_min = x;
135  }
136  else if (x > m_max)
137  {
138  m_max = x;
139  }
140  return *this;
141 }
142 
143 template <class T>
145 {
146  if (i.m_min < m_min)
147  {
148  m_min = i.m_min;
149  }
150  if (i.m_max > m_max)
151  {
152  m_max = i.m_max;
153  }
154  return *this;
155 }
156 
157 template <class T>
159 {
160  return Interval<T>(m_min + i.m_min, m_max + i.m_max);
161 }
162 
163 template <class T>
164 Interval<T> Interval<T>::operator +(const T& v) const
165 {
166  return Interval<T>(m_min + v, m_max + v);
167 }
168 
169 template <class T>
171 {
172  m_min += i.m_min;
173  m_max += i.m_max;
174  return *this;
175 }
176 
177 template <class T>
179 {
180  m_min += v;
181  m_max += v;
182  return *this;
183 }
184 
185 template <class T>
187 {
188  return Interval<T>(-m_max, -m_min);
189 }
190 
191 template <class T>
193 {
194  return Interval<T>(m_min - i.m_max, m_max - i.m_min);
195 }
196 
197 template <class T>
198 Interval<T> Interval<T>::operator -(const T& v) const
199 {
200  return Interval<T>(m_min - v, m_max - v);
201 }
202 
203 template <class T>
205 {
206  m_min -= i.m_max;
207  m_max -= i.m_min;
208  return *this;
209 }
210 
211 template <class T>
213 {
214  m_min -= v;
215  m_max -= v;
216  return *this;
217 }
218 
219 template <class T>
221 {
222  return minToMax(m_min * i.m_min, m_min * i.m_max, m_max * i.m_min, m_max * i.m_max);
223 }
224 
225 template <class T>
226 Interval<T> Interval<T>::operator *(const T& v) const
227 {
228  if (v >= 0)
229  {
230  return Interval<T>(m_min * v, m_max * v);
231  }
232  else
233  {
234  return Interval<T>(m_max * v, m_min * v);
235  }
236 }
237 
238 template <class T>
240 {
241  *this = minToMax(m_min * i.m_min, m_min * i.m_max, m_max * i.m_min, m_max * i.m_max);
242  return *this;
243 }
244 
245 template <class T>
247 {
248  *this = minToMax(v * m_min, v * m_max);
249  return *this;
250 }
251 
252 template <class T>
254 {
255  SURGSIM_ASSERT(!containsZero()) << "Cannot invert or divide by an interval containing 0. Interval: [" <<
256  getMin() << ", " << getMax() << "]" << std::endl;
257  return Interval<T>(static_cast<T>(1) / m_max, static_cast<T>(1) / m_min);
258 }
259 
260 template <class T>
262 {
263  return (*this) * i.inverse();
264 }
265 
266 template <class T>
268 {
269  return (*this) = (*this) * i.inverse();
270 }
271 
272 template <class T>
274 {
275  T lowerBoundSquared = m_min * m_min;
276  T upperBoundSquared = m_max * m_max;
277  T minSquare, maxSquare;
278  minMax(lowerBoundSquared, upperBoundSquared, &minSquare, &maxSquare);
279  return Interval<T>((m_min < 0 && m_max > 0) ? 0 : minSquare, maxSquare);
280 }
281 
282 template <class T>
284 {
285  return m_min;
286 }
287 
288 template <class T>
290 {
291  return m_max;
292 }
293 
294 template <class T>
296 {
297  return Interval<T>(m_min, (m_min + m_max) * static_cast<T>(0.5));
298 }
299 
300 template <class T>
302 {
303  return Interval<T>((m_min + m_max) * static_cast<T>(0.5), m_max);
304 }
305 
306 // Class ND
307 template <class T, int N>
309 {
310  for (int i = 0; i < N; i++)
311  {
312  m_interval[i] = Interval<T>();
313  }
314 }
315 
316 template <class T, int N>
318 {
319  for (int i = 0; i < N; i++)
320  {
321  m_interval[i] = x[i];
322  }
323 }
324 
325 template <class T, int N>
327 {
328  for (int i = 0; i < N; i++)
329  {
330  m_interval[i] = interval.m_interval[i];
331  }
332 }
333 
334 template <class T, int N>
336 {
337  for (int j = 0; j < N; j++)
338  {
339  m_interval[j] = i.m_interval[j];
340  }
341 }
342 
343 template <class T, int N>
344 IntervalND<T, N>::IntervalND(const std::array<T, N>& a, const std::array<T, N>& b)
345 {
346  for (int i = 0; i < N; ++i)
347  {
348  m_interval[i] = Interval<T>::minToMax(a[i], b[i]);
349  }
350 }
351 
352 template <class T, int N>
354 {
355  for (int i = 0; i < N; i++)
356  {
357  m_interval[i] = interval.m_interval[i];
358  }
359  return *this;
360 }
361 
362 template <class T, int N>
364 {
365  if (this != &i)
366  {
367  for (int j = 0; j < N; j++)
368  {
369  m_interval[j] = i.m_interval[j];
370  }
371  }
372 
373  return *this;
374 }
375 
376 template <class T, int N>
378 {
379  // For the rectangular [hyper]prisms to overlap, they must overlap in all axes.
380  for (int i = 0; i < N; ++i)
381  {
382  if (!m_interval[i].overlapsWith(interval.m_interval[i]))
383  {
384  return false;
385  }
386  }
387  return true;
388 }
389 
390 template <class T, int N>
391 bool IntervalND<T, N>::isApprox(const IntervalND<T, N>& interval, const T& epsilon) const
392 {
393  for (int i = 0; i < N; i++)
394  {
395  if (!m_interval[i].isApprox(interval.m_interval[i], epsilon))
396  {
397  return false;
398  }
399  }
400  return true;
401 }
402 
403 template <class T, int N>
405 {
406  for (int i = 0; i < N; i++)
407  {
408  if (m_interval[i] != interval.m_interval[i])
409  {
410  return false;
411  }
412  }
413  return true;
414 }
415 
416 template <class T, int N>
418 {
419  return !(this->operator==(interval));
420 }
421 
422 template <class T, int N>
424 {
425  for (int i = 0; i < N; i++)
426  {
427  m_interval[i].addThickness(thickness);
428  }
429  return *this;
430 }
431 
432 template <class T, int N>
434 {
435  IntervalND<T, N> ret;
436  for (int i = 0; i < N; i++)
437  {
438  ret.m_interval[i] = m_interval[i] + interval.m_interval[i];
439  }
440  return ret;
441 }
442 
443 template <class T, int N>
445 {
446  for (int i = 0; i < N; i++)
447  {
448  m_interval[i] += interval.m_interval[i];
449  }
450  return *this;
451 }
452 
453 template <class T, int N>
455 {
456  IntervalND<T, N> ret;
457  for (int i = 0; i < N; i++)
458  {
459  ret.m_interval[i] = m_interval[i] - interval.m_interval[i];
460  }
461  return ret;
462 }
463 
464 template <class T, int N>
466 {
467  for (int i = 0; i < N; i++)
468  {
469  m_interval[i] -= interval.m_interval[i];
470  }
471  return *this;
472 }
473 
474 template <class T, int N>
476 {
477  IntervalND<T, N> ret;
478  for (int i = 0; i < N; i++)
479  {
480  ret.m_interval[i] = m_interval[i] * interval.m_interval[i];
481  }
482  return ret;
483 }
484 
485 template <class T, int N>
487 {
488  for (int i = 0; i < N; i++)
489  {
490  m_interval[i] *= interval.m_interval[i];
491  }
492  return *this;
493 }
494 
495 template <class T, int N>
497 {
498  IntervalND<T, N> ret;
499  for (int i = 0; i < N; i++)
500  {
501  ret.m_interval[i] = m_interval[i].inverse();
502  }
503  return ret;
504 }
505 
506 template <class T, int N>
508 {
509  IntervalND<T, N> ret;
510  for (int i = 0; i < N; i++)
511  {
512  ret.m_interval[i] = m_interval[i] / interval.m_interval[i];
513  }
514  return ret;
515 }
516 
517 template <class T, int N>
519 {
520  for (int i = 0; i < N; i++)
521  {
522  m_interval[i] /= interval.m_interval[i];
523  }
524  return *this;
525 }
526 
527 template <class T, int N>
529 {
530  Interval<T> ret(static_cast<T>(0), static_cast<T>(0));
531  for (int i = 0; i < N; i++)
532  {
533  ret += m_interval[i] * interval.m_interval[i];
534  }
535  return ret;
536 }
537 
538 template <class T, int N>
540 {
541  Interval<T> result = m_interval[0].square();
542  for (int i = 1; i < N; ++i)
543  {
544  result += m_interval[i].square();
545  }
546  return result;
547 }
548 
549 template <class T, int N>
551 {
552  Interval<T> magnitudeSq = magnitudeSquared();
553  // Both minimum and maximum are guaranteed to be non-negative.
554  return Interval<T>(sqrt(magnitudeSq.getMin()), sqrt(magnitudeSq.getMax()));
555 }
556 
557 template <class T, int N>
559 {
560  return m_interval[i];
561 }
562 
563 template <class T>
565 {
566  m_interval[0] = Interval<T>();
567  m_interval[1] = Interval<T>();
568  m_interval[2] = Interval<T>();
569 }
570 
571 template <class T>
573 {
574  m_interval[0] = x[0];
575  m_interval[1] = x[1];
576  m_interval[2] = x[2];
577 }
578 
579 template <class T>
581 {
582  m_interval[0] = x;
583  m_interval[1] = y;
584  m_interval[2] = z;
585 }
586 
587 template <class T>
589 {
590  m_interval[0] = i.m_interval[0];
591  m_interval[1] = i.m_interval[1];
592  m_interval[2] = i.m_interval[2];
593 }
594 
595 template <class T>
597 {
598  m_interval[0] = i.m_interval[0];
599  m_interval[1] = i.m_interval[1];
600  m_interval[2] = i.m_interval[2];
601 }
602 
603 template <class T>
604 IntervalND<T, 3>::IntervalND(const std::array<T, 3>& a, const std::array<T, 3>& b)
605 {
606  m_interval[0] = Interval<T>::minToMax(a[0], b[0]);
607  m_interval[1] = Interval<T>::minToMax(a[1], b[1]);
608  m_interval[2] = Interval<T>::minToMax(a[2], b[2]);
609 }
610 
611 template <class T>
613 {
614  m_interval[0] = i.m_interval[0];
615  m_interval[1] = i.m_interval[1];
616  m_interval[2] = i.m_interval[2];
617  return *this;
618 }
619 
620 template <class T>
622 {
623  m_interval[0] = i.m_interval[0];
624  m_interval[1] = i.m_interval[1];
625  m_interval[2] = i.m_interval[2];
626  return *this;
627 }
628 
629 template <class T>
631 {
632  // For the rectangular prisms to overlap, they must overlap in all axes.
633  return (m_interval[0].overlapsWith(interval.m_interval[0]) && m_interval[1].overlapsWith(interval.m_interval[1])
634  && m_interval[2].overlapsWith(interval.m_interval[2]));
635 }
636 
637 template <class T>
638 bool IntervalND<T, 3>::isApprox(const IntervalND<T, 3>& i, const T& epsilon) const
639 {
640  return (m_interval[0].isApprox(i.m_interval[0], epsilon) && m_interval[1].isApprox(i.m_interval[1], epsilon) &&
641  m_interval[2].isApprox(i.m_interval[2], epsilon));
642 }
643 
644 template <class T>
646 {
647  return (m_interval[0] == i.m_interval[0] && m_interval[1] == i.m_interval[1] && m_interval[2] == i.m_interval[2]);
648 }
649 
650 template <class T>
652 {
653  return !(this->operator==(i));
654 }
655 
656 template <class T>
658 {
659  m_interval[0].addThickness(thickness);
660  m_interval[1].addThickness(thickness);
661  m_interval[2].addThickness(thickness);
662  return *this;
663 }
664 
665 template <class T>
667 {
668  return IntervalND<T, 3>(m_interval[0] + i.m_interval[0], m_interval[1] + i.m_interval[1],
669  m_interval[2] + i.m_interval[2]);
670 }
671 
672 template <class T>
674 {
675  m_interval[0] += i.m_interval[0];
676  m_interval[1] += i.m_interval[1];
677  m_interval[2] += i.m_interval[2];
678  return *this;
679 }
680 
681 template <class T>
683 {
684  return IntervalND<T, 3>(m_interval[0] - i.m_interval[0], m_interval[1] - i.m_interval[1],
685  m_interval[2] - i.m_interval[2]);
686 }
687 
688 template <class T>
690 {
691  m_interval[0] -= i.m_interval[0];
692  m_interval[1] -= i.m_interval[1];
693  m_interval[2] -= i.m_interval[2];
694  return *this;
695 }
696 
697 template <class T>
699 {
700  return IntervalND<T, 3>(m_interval[0] * i.m_interval[0], m_interval[1] * i.m_interval[1],
701  m_interval[2] * i.m_interval[2]);
702 }
703 
704 template <class T>
706 {
707  m_interval[0] *= i.m_interval[0];
708  m_interval[1] *= i.m_interval[1];
709  m_interval[2] *= i.m_interval[2];
710  return *this;
711 }
712 
713 template <class T>
715 {
716  return IntervalND<T, 3>(m_interval[0].inverse(), m_interval[1].inverse(), m_interval[2].inverse());
717 }
718 
719 template <class T>
721 {
722  return IntervalND<T, 3>(m_interval[0] / i.m_interval[0], m_interval[1] / i.m_interval[1],
723  m_interval[2] / i.m_interval[2]);
724 }
725 
726 template <class T>
728 {
729  m_interval[0] /= i.m_interval[0];
730  m_interval[1] /= i.m_interval[1];
731  m_interval[2] /= i.m_interval[2];
732  return *this;
733 }
734 
735 template <class T>
737 {
738  return (m_interval[0] * i.m_interval[0] + m_interval[1] * i.m_interval[1] + m_interval[2] * i.m_interval[2]);
739 }
740 
741 template <class T>
743 {
744  return IntervalND<T, 3>(m_interval[1] * i.m_interval[2] - m_interval[2] * i.m_interval[1],
745  m_interval[2] * i.m_interval[0] - m_interval[0] * i.m_interval[2],
746  m_interval[0] * i.m_interval[1] - m_interval[1] * i.m_interval[0]);
747 }
748 
749 template <class T>
751 {
752  return m_interval[0].square() + m_interval[1].square() + m_interval[2].square();
753 }
754 
755 template <class T>
757 {
758  Interval<T> magnitudeSq = magnitudeSquared();
759  // Both minimum and maximum are guaranteed to be non-negative.
760  return Interval<T>(sqrt(magnitudeSq.getMin()), sqrt(magnitudeSq.getMax()));
761 }
762 
763 template <class T>
765 {
766  return m_interval[i];
767 }
768 
769 // Utility functions not part of any class
770 template <typename T>
771 Interval<T> operator+ (T v, const Interval<T>& i)
772 {
773  return i + v;
774 }
775 
776 template <typename T>
777 Interval<T> operator* (T v, const Interval<T>& i)
778 {
779  return i * v;
780 }
781 
782 template <class T>
783 void IntervalArithmetic_add(const Interval<T>& a, const Interval<T>& b, Interval<T>* res)
784 {
785  res->m_min = a.m_min + b.m_min;
786  res->m_max = a.m_max + b.m_max;
787 }
788 
789 template <class T>
790 void IntervalArithmetic_addadd(const Interval<T>& a, const Interval<T>& b, Interval<T>* res)
791 {
792  res->m_min += a.m_min + b.m_min;
793  res->m_max += a.m_max + b.m_max;
794 }
795 
796 template <class T>
797 void IntervalArithmetic_sub(const Interval<T>& a, const Interval<T>& b, Interval<T>* res)
798 {
799  res->m_min = a.m_min - b.m_max;
800  res->m_max = a.m_max - b.m_min;
801 }
802 
803 template <class T>
804 void IntervalArithmetic_addsub(const Interval<T>& a, const Interval<T>& b, Interval<T>* res)
805 {
806  res->m_min += a.m_min - b.m_max;
807  res->m_max += a.m_max - b.m_min;
808 }
809 
810 template <class T>
811 void IntervalArithmetic_mul(const Interval<T>& a, const Interval<T>& b, Interval<T>* res)
812 {
813  T min, max;
814  minMax(a.m_min * b.m_min, a.m_min * b.m_max, a.m_max * b.m_min, a.m_max * b.m_max, &min, &max);
815  res->m_min = min;
816  res->m_max = max;
817 }
818 
819 template <class T>
820 void IntervalArithmetic_addmul(const Interval<T>& a, const Interval<T>& b, Interval<T>* res)
821 {
822  T min, max;
823  minMax(a.m_min * b.m_min, a.m_min * b.m_max, a.m_max * b.m_min, a.m_max * b.m_max, &min, &max);
824  res->m_min += min;
825  res->m_max += max;
826 }
827 
828 template <class T>
829 void IntervalArithmetic_submul(const Interval<T>& a, const Interval<T>& b, Interval<T>* res)
830 {
831  T min, max;
832  minMax(a.m_min * b.m_min, a.m_min * b.m_max, a.m_max * b.m_min, a.m_max * b.m_max, &min, &max);
833  res->m_min -= max;
834  res->m_max -= min;
835 }
836 
837 // Interval functions
838 template <typename T>
839 std::ostream& operator<< (std::ostream& o, const Interval<T>& interval)
840 {
841  o << "[" << interval.getMin() << "," << interval.getMax() << "]";
842  return o;
843 }
844 
845 // Interval ND functions
846 template <typename T, int N>
847 std::ostream& operator<< (std::ostream& o, const IntervalND<T, N>& interval)
848 {
849  o << "(" << interval.getAxis(0);
850  for (int i = 1; i < N; ++i)
851  {
852  o << ";" << interval.getAxis(i);
853  }
854  o << ")";
855  return o;
856 }
857 
858 // Interval 3D functions
859 template <class T>
861 {
862  IntervalArithmetic_add(a.m_interval[0], b.m_interval[0], &(res->m_interval[0]));
863  IntervalArithmetic_add(a.m_interval[1], b.m_interval[1], &(res->m_interval[1]));
864  IntervalArithmetic_add(a.m_interval[2], b.m_interval[2], &(res->m_interval[2]));
865 }
866 
867 template <class T>
869 {
870  IntervalArithmetic_sub(a.m_interval[0], b.m_interval[0], &(res->m_interval[0]));
871  IntervalArithmetic_sub(a.m_interval[1], b.m_interval[1], &(res->m_interval[1]));
872  IntervalArithmetic_sub(a.m_interval[2], b.m_interval[2], &(res->m_interval[2]));
873 }
874 
875 template <class T>
876 void IntervalArithmetic_crossProduct(const IntervalND<T, 3>& a, const IntervalND<T, 3>& b, IntervalND<T, 3>* res)
877 {
878  IntervalArithmetic_mul(a.m_interval[1], b.m_interval[2], &(res->m_interval[0]));
879  IntervalArithmetic_submul(a.m_interval[2], b.m_interval[1], &(res->m_interval[0]));
880 
881  IntervalArithmetic_mul(a.m_interval[2], b.m_interval[0], &(res->m_interval[1]));
882  IntervalArithmetic_submul(a.m_interval[0], b.m_interval[2], &(res->m_interval[1]));
883 
884  IntervalArithmetic_mul(a.m_interval[0], b.m_interval[1], &(res->m_interval[2]));
885  IntervalArithmetic_submul(a.m_interval[1], b.m_interval[0], &(res->m_interval[2]));
886 }
887 
888 template <class T>
889 void IntervalArithmetic_dotProduct(const IntervalND<T, 3>& a, const IntervalND<T, 3>& b, Interval<T>* res)
890 {
891  IntervalArithmetic_mul(a.m_interval[0], b.m_interval[0], res);
892  IntervalArithmetic_addmul(a.m_interval[1], b.m_interval[1], res);
893  IntervalArithmetic_addmul(a.m_interval[2], b.m_interval[2], res);
894 }
895 
896 }; // Math
897 }; // SurgSim
898 
899 #endif // SURGSIM_MATH_INTERVALARITHMETIC_INL_H
Interval< T > & operator=(const Interval< T > &i)
Assignment operator.
Definition: IntervalArithmetic-inl.h:46
IntervalND< T, N > & operator/=(const IntervalND< T, N > &interval)
Definition: IntervalArithmetic-inl.h:518
Wraps glewInit() to separate the glew opengl definitions from the osg opengl definitions only imgui n...
Definition: AddRandomSphereBehavior.cpp:36
T getMin() const
Definition: IntervalArithmetic-inl.h:283
bool isApprox(const Interval< T > &i, const T &epsilon) const
Definition: IntervalArithmetic-inl.h:104
IntervalND< T, N > operator/(const IntervalND< T, N > &interval) const
Definition: IntervalArithmetic-inl.h:507
IntervalND<T,3> defines the concept of a group of mathematical intervals specialized to 3 intervals a...
Definition: IntervalArithmetic.h:307
bool isApprox(const IntervalND< T, N > &interval, const T &epsilon) const
Definition: IntervalArithmetic-inl.h:391
Interval< T > upperHalf() const
Definition: IntervalArithmetic-inl.h:301
#define SURGSIM_ASSERT(condition)
Assert that condition is true.
Definition: Assert.h:77
bool operator!=(const IntervalND< T, N > &interval) const
Definition: IntervalArithmetic-inl.h:417
T getMax() const
Definition: IntervalArithmetic-inl.h:289
friend void IntervalArithmetic_addsub(const Interval< P > &a, const Interval< P > &b, Interval< P > *res)
Add the difference of two intervals to an existing value.
Interval< T > inverse() const
Definition: IntervalArithmetic-inl.h:253
IntervalND()
Constructor.
Definition: IntervalArithmetic-inl.h:308
IntervalND defines the concept of a group of mathematical intervals and provides operations on them i...
Definition: IntervalArithmetic.h:199
Interval< T > dotProduct(const IntervalND< T, N > &interval) const
Definition: IntervalArithmetic-inl.h:528
Interval< T > & addThickness(const T &thickness)
Widens the current interval by thickness on both sides.
Definition: IntervalArithmetic-inl.h:122
Interval< T > magnitudeSquared() const
Definition: IntervalArithmetic-inl.h:539
friend void IntervalArithmetic_addmul(const Interval< P > &a, const Interval< P > &b, Interval< P > *res)
Add the product of two intervals to an existing value.
friend void IntervalArithmetic_sub(const Interval< P > &a, const Interval< P > &b, Interval< P > *res)
Calculate the difference of two intervals.
friend void IntervalArithmetic_add(const Interval< P > &a, const Interval< P > &b, Interval< P > *res)
Calculate the sum of two intervals.
IntervalND< T, N > & operator=(const IntervalND< T, N > &interval)
Assignment operator.
Definition: IntervalArithmetic-inl.h:353
Interval< T > & operator/=(const Interval< T > &i)
Definition: IntervalArithmetic-inl.h:267
bool overlapsWith(const IntervalND< T, N > &interval) const
Definition: IntervalArithmetic-inl.h:377
bool operator==(const IntervalND< T, N > &interval) const
Definition: IntervalArithmetic-inl.h:404
bool operator!=(const Interval< T > &i) const
Definition: IntervalArithmetic-inl.h:116
friend void IntervalArithmetic_submul(const Interval< P > &a, const Interval< P > &b, Interval< P > *res)
Subtract the product of two intervals from an existing value.
friend void IntervalArithmetic_mul(const Interval< P > &a, const Interval< P > &b, Interval< P > *res)
Calculate the product of two intervals.
Interval< T > operator+(const Interval< T > &i) const
Definition: IntervalArithmetic-inl.h:158
const Interval< T > & getAxis(size_t i) const
Definition: IntervalArithmetic-inl.h:558
Interval< T > & extendToInclude(const T &x)
Widens the current interval on one end to include x.
Definition: IntervalArithmetic-inl.h:130
bool operator==(const Interval< T > &i) const
Definition: IntervalArithmetic-inl.h:110
bool overlapsWith(const Interval< T > &i) const
Definition: IntervalArithmetic-inl.h:86
Interval defines the concept of a mathematical interval and provides operations on it including arith...
Definition: IntervalArithmetic.h:34
IntervalND< T, N > inverse() const
Definition: IntervalArithmetic-inl.h:496
Interval< T > magnitude() const
Definition: IntervalArithmetic-inl.h:550
friend void IntervalArithmetic_addadd(const Interval< P > &a, const Interval< P > &b, Interval< P > *res)
Calculate the sum of three intervals res + a + b.
Interval()
Constructor.
Definition: IntervalArithmetic-inl.h:27
bool contains(const T &val) const
Definition: IntervalArithmetic-inl.h:92
Interval< T > operator/(const Interval< T > &i) const
Definition: IntervalArithmetic-inl.h:261
IntervalND< T, N > operator+(const IntervalND< T, N > &interval) const
Definition: IntervalArithmetic-inl.h:433
IntervalND< T, N > & addThickness(const T &thickness)
Widens every interval in the current interval group by thickness on both sides.
Definition: IntervalArithmetic-inl.h:423
Interval< T > square() const
Definition: IntervalArithmetic-inl.h:273
bool containsZero() const
Definition: IntervalArithmetic-inl.h:98
static Interval< T > minToMax(const T &a1, const T &a2)
Generate an interval from min to max based on the inputs.
Definition: IntervalArithmetic-inl.h:62
Interval< T > lowerHalf() const
Definition: IntervalArithmetic-inl.h:295