Go to the documentation of this file.
16 #ifndef SURGSIM_MATH_POLYNOMIAL_INL_H
17 #define SURGSIM_MATH_POLYNOMIAL_INL_H
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";
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";
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";
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);
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>
684 for (
int i = N; i > 1; --i)
686 stream << p.getCoefficient(i) <<
"*x^" << i <<
" + ";
690 stream << p.getCoefficient(1) <<
"*x + ";
692 stream << p.getCoefficient(0) <<
")";
699 #endif // SURGSIM_MATH_POLYNOMIAL_INL_H
#define SURGSIM_ASSERT(condition)
Assert that condition is true.
Definition: Assert.h:77
Polynomial<T, 0> specializes the Polynomial class for degree 0 (constant polynomials)
Definition: Polynomial.h:56
T m_a0
Definition: Polynomial.h:110
bool isNearZero(const T &value, const T &epsilon)
Define an utility function for comparing individual coefficients to 0.
Definition: Polynomial-inl.h:30
T m_a1
Definition: Polynomial.h:247
T getCoefficient(size_t i) const
Definition: Polynomial-inl.h:235
T m_a0
Definition: Polynomial.h:315
T m_a0
Definition: Polynomial.h:175
Definition: CompoundShapeToGraphics.cpp:29
Interval< T > operator*(T v, const Interval< T > &i)
Definition: IntervalArithmetic-inl.h:777
T getCoefficient(size_t i) const
Definition: Polynomial-inl.h:387
T getCoefficient(size_t i) const
Definition: Polynomial-inl.h:117
T m_a0
Definition: Polynomial.h:246
T m_a3
Definition: Polynomial.h:318
Polynomial<T, N> defines the concept of an N degree polynomial with type T coefficients and provides ...
Definition: Polynomial.h:47
std::ostream & operator<<(std::ostream &o, const Interval< T > &interval)
Write a textual version of the interval to an output stream.
Definition: IntervalArithmetic-inl.h:839
T m_a2
Definition: Polynomial.h:248
Polynomial<T, 1> specializes the Polynomial class for degree 1 (linear polynomials)
Definition: Polynomial.h:117
T m_a2
Definition: Polynomial.h:317
T m_a1
Definition: Polynomial.h:176
Polynomial<T, 3> specializes the Polynomial class for degree 3 (cubic polynomials)
Definition: Polynomial.h:255
Polynomial< T, 0 > square(const Polynomial< T, 0 > &p)
Square a degree 0 polynomial.
Definition: Polynomial-inl.h:666
T m_a1
Definition: Polynomial.h:316
Polynomial<T, 2> specializes the Polynomial class for degree 2 (quadratic polynomials)
Definition: Polynomial.h:183
Interval< T > operator+(T v, const Interval< T > &i)
Definition: IntervalArithmetic-inl.h:771