FindRoot.h 992 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. // Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
  2. // SPDX-FileCopyrightText: 2021 Jorrit Rouwe
  3. // SPDX-License-Identifier: MIT
  4. #pragma once
  5. JPH_NAMESPACE_BEGIN
  6. /// Find the roots of \f$inA \: x^2 + inB \: x + inC = 0\f$.
  7. /// @return The number of roots, actual roots in outX1 and outX2.
  8. /// If number of roots returned is 1 then outX1 == outX2.
  9. template <typename T>
  10. inline int FindRoot(const T inA, const T inB, const T inC, T &outX1, T &outX2)
  11. {
  12. // Check if this is a linear equation
  13. if (inA == T(0))
  14. {
  15. // Check if this is a constant equation
  16. if (inB == T(0))
  17. return 0;
  18. // Linear equation with 1 solution
  19. outX1 = outX2 = -inC / inB;
  20. return 1;
  21. }
  22. // See Numerical Recipes in C, Chapter 5.6 Quadratic and Cubic Equations
  23. T det = Square(inB) - T(4) * inA * inC;
  24. if (det < T(0))
  25. return 0;
  26. T q = (inB + Sign(inB) * sqrt(det)) / T(-2);
  27. outX1 = q / inA;
  28. if (q == T(0))
  29. {
  30. outX2 = outX1;
  31. return 1;
  32. }
  33. outX2 = inC / q;
  34. return 2;
  35. }
  36. JPH_NAMESPACE_END