16 #ifndef SURGSIM_MATH_POLYNOMIAL_INL_H 17 #define SURGSIM_MATH_POLYNOMIAL_INL_H 22 #include "SurgSim/Math/IntervalArithmetic.h" 30 bool isNearZero(
const T& value,
const T& epsilon)
32 return (value + epsilon >= 0 && value - epsilon <= 0);
62 return const_cast<T&
>(
const_cast<const Polynomial<T, 0>*
>(
this)->
operator[](i));
68 SURGSIM_ASSERT(i <= 0) <<
"Attempting to set a coefficient greater than the polynomial degree";
107 return SurgSim::Math::isNearZero(m_a0, epsilon);
113 return ((*
this) - p).isNearZero(epsilon);
131 SURGSIM_ASSERT(i <= 0) <<
"Attempting to set a coefficient greater than the polynomial degree";
150 return m_a1 * x + m_a0;
162 return const_cast<T&
>(
const_cast<const Polynomial<T, 1>*
>(
this)->
operator[](i));
168 SURGSIM_ASSERT(i <= 1) <<
"Attempting to set a coefficient greater than the polynomial degree";
191 return Polynomial(m_a0 + rhs.m_a0, m_a1 + rhs.m_a1);
205 return Polynomial(m_a0 - rhs.m_a0, m_a1 - rhs.m_a1);
225 return SurgSim::Math::isNearZero(m_a0, epsilon) && SurgSim::Math::isNearZero(m_a1, epsilon);
231 return ((*
this) - p).isNearZero(epsilon);
257 SURGSIM_ASSERT(i <= 1) <<
"Attempting to set a coefficient greater than the polynomial degree";
288 return m_a1 * m_a1 -
static_cast<T
>(4) * m_a0 * m_a2;
294 return (m_a2 * x + m_a1) * x + m_a0;
306 return const_cast<T&
>(
const_cast<const Polynomial<T, 2>*
>(
this)->
operator[](i));
312 SURGSIM_ASSERT(i <= 2) <<
"Attempting to set a coefficient greater than the polynomial degree";
339 return Polynomial(m_a0 + rhs.m_a0, m_a1 + rhs.m_a1, m_a2 + rhs.m_a2);
354 return Polynomial(m_a0 - rhs.m_a0, m_a1 - rhs.m_a1, m_a2 - rhs.m_a2);
375 return SurgSim::Math::isNearZero(m_a0, epsilon) &&
376 SurgSim::Math::isNearZero(m_a1, epsilon) &&
377 SurgSim::Math::isNearZero(m_a2, epsilon);
383 return ((*
this) - p).isNearZero(epsilon);
413 SURGSIM_ASSERT(i <= 2) <<
"Attempting to set a coefficient greater than the polynomial degree";
438 m_a0(static_cast<T>(0)),
439 m_a1(static_cast<T>(0)),
440 m_a2(static_cast<T>(0)),
441 m_a3(static_cast<T>(0))
457 return ((m_a3 * x + m_a2) * x + m_a1) * x + m_a0;
469 return const_cast<T&
>(
const_cast<const Polynomial<T, 3>*
>(
this)->
operator[](i));
475 SURGSIM_ASSERT(i <= 3) <<
"Attempting to set or access a coefficient greater than the polynomial degree";
500 return Polynomial(-m_a0, -m_a1, -m_a2, -m_a3);
506 return Polynomial(m_a0 + rhs.m_a0, m_a1 + rhs.m_a1, m_a2 + rhs.m_a2, m_a3 + rhs.m_a3);
522 return Polynomial(m_a0 - rhs.m_a0, m_a1 - rhs.m_a1, m_a2 - rhs.m_a2, m_a3 - rhs.m_a3);
544 return SurgSim::Math::isNearZero(m_a0, epsilon) &&
545 SurgSim::Math::isNearZero(m_a1, epsilon) &&
546 SurgSim::Math::isNearZero(m_a2, epsilon) &&
547 SurgSim::Math::isNearZero(m_a3, epsilon);
553 return ((*
this) - p).isNearZero(epsilon);
587 SURGSIM_ASSERT(i <= 3) <<
"Attempting to set a coefficient greater than the polynomial degree";
615 template <
typename T,
int N,
int M>
619 for (
int i = 0; i <= N + M; ++i)
622 int jMin = std::max(0, i - M);
623 int jMax = std::min(i, N);
624 for (
int j = jMin; j <= jMax; ++j)
626 coeff += p.getCoefficient(j) * q.getCoefficient(i - j);
628 result.setCoefficient(i, coeff);
633 template <
typename T>
643 template <
typename T>
651 return Polynomial<T, 3>(p0 * q0, p0 * q1 + p1 * q0, p1 * q1 + p2 * q0, p2 * q1);
654 template <
typename T>
662 return Polynomial<T, 3>(p0 * q0, p0 * q1 + p1 * q0, p0 * q2 + p1 * q1, p1 * q2);
665 template <
typename T>
672 template <
typename T>
680 template <
typename T,
int N>
681 inline std::ostream& operator<<(std::ostream& stream, const Polynomial<T, N>& p)
684 for (
int i = N; i > 1; --i)
699 #endif // SURGSIM_MATH_POLYNOMIAL_INL_H Wraps glewInit() to separate the glew opengl definitions from the osg opengl definitions only imgui n...
Definition: AddRandomSphereBehavior.cpp:36
Polynomial<T, 0> specializes the Polynomial class for degree 0 (constant polynomials) ...
Definition: Polynomial.h:56
T getCoefficient(size_t i) const
Definition: Polynomial-inl.h:387
Polynomial<T, N> defines the concept of an N degree polynomial with type T coefficients and provides ...
Definition: Polynomial.h:47
#define SURGSIM_ASSERT(condition)
Assert that condition is true.
Definition: Assert.h:77
Polynomial<T, 3> specializes the Polynomial class for degree 3 (cubic polynomials) ...
Definition: Polynomial.h:255
T getCoefficient(size_t i) const
Definition: Polynomial-inl.h:235
Polynomial<T, 2> specializes the Polynomial class for degree 2 (quadratic polynomials) ...
Definition: Polynomial.h:183
T getCoefficient(size_t i) const
Definition: Polynomial-inl.h:117
Polynomial<T, 1> specializes the Polynomial class for degree 1 (linear polynomials) ...
Definition: Polynomial.h:117