16 #ifndef SURGSIM_MATH_INTERVALARITHMETIC_INL_H 17 #define SURGSIM_MATH_INTERVALARITHMETIC_INL_H 19 #include "SurgSim/Math/MinMax.h" 32 SURGSIM_ASSERT(min <= max) <<
"Incorrect order of interval bounds";
65 minMax(a1, a2, &min, &max);
73 minMax(a1, a2, a3, &min, &max);
81 minMax(a1, a2, a3, a4, &min, &max);
88 return (m_min <= i.m_max && i.m_min <= m_max);
94 return (m_min <= val && m_max >= val);
106 return (std::abs(m_min - i.m_min) <= epsilon) && (std::abs(m_max - i.m_max) <= epsilon);
112 return (m_min == i.m_min && m_max == i.m_max);
160 return Interval<T>(m_min + i.m_min, m_max + i.m_max);
194 return Interval<T>(m_min - i.m_max, m_max - i.m_min);
222 return minToMax(m_min * i.m_min, m_min * i.m_max, m_max * i.m_min, m_max * i.m_max);
241 *
this =
minToMax(m_min * i.m_min, m_min * i.m_max, m_max * i.m_min, m_max * i.m_max);
248 *
this =
minToMax(v * m_min, v * m_max);
257 return Interval<T>(
static_cast<T
>(1) / m_max, static_cast<T>(1) / m_min);
269 return (*
this) = (*this) * i.
inverse();
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);
297 return Interval<T>(m_min, (m_min + m_max) * static_cast<T>(0.5));
303 return Interval<T>((m_min + m_max) * static_cast<T>(0.5), m_max);
307 template <
class T,
int N>
310 for (
int i = 0; i < N; i++)
316 template <
class T,
int N>
319 for (
int i = 0; i < N; i++)
321 m_interval[i] = x[i];
325 template <
class T,
int N>
328 for (
int i = 0; i < N; i++)
330 m_interval[i] = interval.m_interval[i];
334 template <
class T,
int N>
337 for (
int j = 0; j < N; j++)
339 m_interval[j] = i.m_interval[j];
343 template <
class T,
int N>
346 for (
int i = 0; i < N; ++i)
352 template <
class T,
int N>
355 for (
int i = 0; i < N; i++)
357 m_interval[i] = interval.m_interval[i];
362 template <
class T,
int N>
367 for (
int j = 0; j < N; j++)
369 m_interval[j] = i.m_interval[j];
376 template <
class T,
int N>
380 for (
int i = 0; i < N; ++i)
382 if (!m_interval[i].
overlapsWith(interval.m_interval[i]))
390 template <
class T,
int N>
393 for (
int i = 0; i < N; i++)
395 if (!m_interval[i].
isApprox(interval.m_interval[i], epsilon))
403 template <
class T,
int N>
406 for (
int i = 0; i < N; i++)
408 if (m_interval[i] != interval.m_interval[i])
416 template <
class T,
int N>
422 template <
class T,
int N>
425 for (
int i = 0; i < N; i++)
427 m_interval[i].addThickness(thickness);
432 template <
class T,
int N>
436 for (
int i = 0; i < N; i++)
438 ret.m_interval[i] = m_interval[i] + interval.m_interval[i];
443 template <
class T,
int N>
446 for (
int i = 0; i < N; i++)
448 m_interval[i] += interval.m_interval[i];
453 template <
class T,
int N>
457 for (
int i = 0; i < N; i++)
459 ret.m_interval[i] = m_interval[i] - interval.m_interval[i];
464 template <
class T,
int N>
467 for (
int i = 0; i < N; i++)
469 m_interval[i] -= interval.m_interval[i];
474 template <
class T,
int N>
478 for (
int i = 0; i < N; i++)
480 ret.m_interval[i] = m_interval[i] * interval.m_interval[i];
485 template <
class T,
int N>
488 for (
int i = 0; i < N; i++)
490 m_interval[i] *= interval.m_interval[i];
495 template <
class T,
int N>
499 for (
int i = 0; i < N; i++)
501 ret.m_interval[i] = m_interval[i].inverse();
506 template <
class T,
int N>
510 for (
int i = 0; i < N; i++)
512 ret.m_interval[i] = m_interval[i] / interval.m_interval[i];
517 template <
class T,
int N>
520 for (
int i = 0; i < N; i++)
522 m_interval[i] /= interval.m_interval[i];
527 template <
class T,
int N>
530 Interval<T> ret(static_cast<T>(0), static_cast<T>(0));
531 for (
int i = 0; i < N; i++)
533 ret += m_interval[i] * interval.m_interval[i];
538 template <
class T,
int N>
542 for (
int i = 1; i < N; ++i)
544 result += m_interval[i].
square();
549 template <
class T,
int N>
557 template <
class T,
int N>
560 return m_interval[i];
574 m_interval[0] = x[0];
575 m_interval[1] = x[1];
576 m_interval[2] = x[2];
590 m_interval[0] = i.m_interval[0];
591 m_interval[1] = i.m_interval[1];
592 m_interval[2] = i.m_interval[2];
598 m_interval[0] = i.m_interval[0];
599 m_interval[1] = i.m_interval[1];
600 m_interval[2] = i.m_interval[2];
614 m_interval[0] = i.m_interval[0];
615 m_interval[1] = i.m_interval[1];
616 m_interval[2] = i.m_interval[2];
623 m_interval[0] = i.m_interval[0];
624 m_interval[1] = i.m_interval[1];
625 m_interval[2] = i.m_interval[2];
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]));
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));
647 return (m_interval[0] == i.m_interval[0] && m_interval[1] == i.m_interval[1] && m_interval[2] == i.m_interval[2]);
659 m_interval[0].addThickness(thickness);
660 m_interval[1].addThickness(thickness);
661 m_interval[2].addThickness(thickness);
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]);
675 m_interval[0] += i.m_interval[0];
676 m_interval[1] += i.m_interval[1];
677 m_interval[2] += i.m_interval[2];
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]);
691 m_interval[0] -= i.m_interval[0];
692 m_interval[1] -= i.m_interval[1];
693 m_interval[2] -= i.m_interval[2];
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]);
707 m_interval[0] *= i.m_interval[0];
708 m_interval[1] *= i.m_interval[1];
709 m_interval[2] *= i.m_interval[2];
716 return IntervalND<T, 3>(m_interval[0].inverse(), m_interval[1].inverse(), m_interval[2].inverse());
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]);
729 m_interval[0] /= i.m_interval[0];
730 m_interval[1] /= i.m_interval[1];
731 m_interval[2] /= i.m_interval[2];
738 return (m_interval[0] * i.m_interval[0] + m_interval[1] * i.m_interval[1] + m_interval[2] * i.m_interval[2]);
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]);
752 return m_interval[0].square() + m_interval[1].square() + m_interval[2].square();
766 return m_interval[i];
770 template <
typename T>
776 template <
typename T>
785 res->m_min = a.m_min + b.m_min;
786 res->m_max = a.m_max + b.m_max;
792 res->m_min += a.m_min + b.m_min;
793 res->m_max += a.m_max + b.m_max;
799 res->m_min = a.m_min - b.m_max;
800 res->m_max = a.m_max - b.m_min;
806 res->m_min += a.m_min - b.m_max;
807 res->m_max += a.m_max - b.m_min;
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);
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);
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);
838 template <
typename T>
839 std::ostream& operator<< (std::ostream& o, const Interval<T>& interval)
841 o <<
"[" << interval.getMin() <<
"," << interval.getMax() <<
"]";
846 template <
typename T,
int N>
847 std::ostream& operator<< (std::ostream& o, const IntervalND<T, N>& interval)
849 o <<
"(" << interval.
getAxis(0);
850 for (
int i = 1; i < N; ++i)
852 o <<
";" << interval.
getAxis(i);
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