Go to the documentation of this file.
16 #ifndef SURGSIM_MATH_POLYNOMIALROOTS_INL_H
17 #define SURGSIM_MATH_POLYNOMIALROOTS_INL_H
25 template <
typename T,
int N>
28 return m_numRoots == DEGENERATE;
31 template <
typename T,
int N>
37 template <
typename T,
int N>
41 "Requesting a root beyond the number of roots available for this polynomial, " <<
42 "or a root with a negative index.";
51 &(this->m_numRoots), &(this->m_roots));
59 &(this->m_numRoots), &(this->m_roots));
63 template <
typename T,
int N>
64 void solve(
const T& a,
const T& b,
const T& epsilon,
int* numRoots, std::array<T, N>* roots)
66 static_assert(N >= 1,
"Root array is not large enough to hold the roots of the polynomial");
88 template <
typename T,
int N>
89 void solve(
const T& a,
const T& b,
const T& c,
const T& epsilon,
int* numRoots, std::array<T, N>* roots)
91 static_assert(N >= 2,
"Root array is not large enough to hold the roots of the polynomial");
97 solve<T, N>(b, c, epsilon, numRoots, roots);
101 T discriminant = b * b - 4.0 * a * c;
102 if (discriminant > epsilon)
105 T sqrtDiscriminant = sqrt(discriminant);
106 (*roots)[0] = (-b - sqrtDiscriminant) / (2 * a);
107 (*roots)[1] = (-b + sqrtDiscriminant) / (2 * a);
108 if ((*roots)[0] > (*roots)[1])
110 std::swap((*roots)[0], (*roots)[1]);
113 else if (discriminant > -epsilon)
116 (*roots)[0] = -b / (2 * a);
127 #endif // SURGSIM_MATH_POLYNOMIALROOTS_INL_H
#define SURGSIM_ASSERT(condition)
Assert that condition is true.
Definition: Assert.h:77
The (algebraic) roots of a Polynomial<N,T>.
Definition: PolynomialRoots.h:36
bool isNearZero(const T &value, const T &epsilon)
Define an utility function for comparing individual coefficients to 0.
Definition: Polynomial-inl.h:30
The common base class for PolynomialRoots specializations for various N.
Definition: PolynomialRoots.h:45
T getCoefficient(size_t i) const
Definition: Polynomial-inl.h:235
Definition: CompoundShapeToGraphics.cpp:30
T getCoefficient(size_t i) const
Definition: Polynomial-inl.h:387
T operator[](int i) const
Read only access to the roots of the polynomial.
Definition: PolynomialRoots-inl.h:38
Polynomial<T, 1> specializes the Polynomial class for degree 1 (linear polynomials)
Definition: Polynomial.h:118
bool isDegenerate() const
Definition: PolynomialRoots-inl.h:26
int getNumRoots() const
Definition: PolynomialRoots-inl.h:32
void solve(const T &a, const T &b, const T &epsilon, int *numRoots, std::array< T, N > *roots)
Specialized solve routine for linear polynomials (2 coefficients)
Definition: PolynomialRoots-inl.h:64
Polynomial<T, 2> specializes the Polynomial class for degree 2 (quadratic polynomials)
Definition: Polynomial.h:184