123456789101112131415161718192021222324252627282930313233343536373839404142 |
- // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
- // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
- // SPDX-License-Identifier: MIT
- #pragma once
- JPH_NAMESPACE_BEGIN
- /// Find the roots of \f$inA \: x^2 + inB \: x + inC = 0\f$.
- /// @return The number of roots, actual roots in outX1 and outX2.
- /// If number of roots returned is 1 then outX1 == outX2.
- template <typename T>
- inline int FindRoot(const T inA, const T inB, const T inC, T &outX1, T &outX2)
- {
- // Check if this is a linear equation
- if (inA == T(0))
- {
- // Check if this is a constant equation
- if (inB == T(0))
- return 0;
- // Linear equation with 1 solution
- outX1 = outX2 = -inC / inB;
- return 1;
- }
- // See Numerical Recipes in C, Chapter 5.6 Quadratic and Cubic Equations
- T det = Square(inB) - T(4) * inA * inC;
- if (det < T(0))
- return 0;
- T q = (inB + Sign(inB) * sqrt(det)) / T(-2);
- outX1 = q / inA;
- if (q == T(0))
- {
- outX2 = outX1;
- return 1;
- }
- outX2 = inC / q;
- return 2;
- }
- JPH_NAMESPACE_END
|