#if UNITY_EDITOR using UnityEngine; namespace O3DWB { public static class Equation { #region Public Static Functions /// /// Solves a quadratic equation with the specified coefficients. /// /// /// The 'a' coefficient of the quadratic equation. /// /// /// The 'b' coefficient of the quadratic equation. /// /// /// The 'x' coefficient of the quadratic equation. /// /// /// If the equation can be solved, this will hold the solution with the smallest value. If /// the equation has only one solution, this will be the same as t2. If no solutions can be /// found (i.e. equation can not be solved) this will be set to 0. /// /// /// If the equation can be solved, this will hold the solution with the biggest value. If /// the equation has only one solution, this will be the same as t1. If no solutions can be /// found (i.e. equation can not be solved) this will be set to 0. /// /// /// True if the equation can be solved and false otherwise. /// public static bool SolveQuadratic(float a, float b, float c, out float t1, out float t2) { t1 = t2 = 0.0f; // Calculate delta. If less than 0, no solutions exist. float delta = b * b - 4.0f * a * c; if (delta < 0.0f) return false; // We have at least one solution, so cache these for later use float deltaSqrt = Mathf.Sqrt(delta); float oneOver2a = 1.0f / (2.0f * a); // 2 solutions? if (delta > 0.0f) { // Calculate the solutions t1 = (-b + deltaSqrt) * oneOver2a; t2 = (-b - deltaSqrt) * oneOver2a; } else t1 = t2 = -b * oneOver2a; // Only one solution // Reorder t values to make sure that t1 is always smaller or equal to t2 if (t1 > t2) { float temp = t1; t1 = t2; t2 = temp; } // At least one solution was found return true; } #endregion } } #endif