/* * Copyright 2023 Google LLC * * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #ifndef SkCubics_DEFINED #define SkCubics_DEFINED #include /** * Utilities for dealing with cubic formulas with one variable: * f(t) = A*t^3 + B*t^2 + C*t + d */ class SkCubics { public: /** * Puts up to 3 real solutions to the equation * A*t^3 + B*t^2 + C*t + d = 0 * in the provided array and returns how many roots that was. */ static int RootsReal(double A, double B, double C, double D, double solution[3]); /** * Puts up to 3 real solutions to the equation * A*t^3 + B*t^2 + C*t + D = 0 * in the provided array, with the constraint that t is in the range [0.0, 1.0], * and returns how many roots that was. */ static int RootsValidT(double A, double B, double C, double D, double solution[3]); /** * Puts up to 3 real solutions to the equation * A*t^3 + B*t^2 + C*t + D = 0 * in the provided array, with the constraint that t is in the range [0.0, 1.0], * and returns how many roots that was. * This is a slower method than RootsValidT, but more accurate in circumstances * where floating point error gets too big. */ static int BinarySearchRootsValidT(double A, double B, double C, double D, double solution[3]); /** * Evaluates the cubic function with the 4 provided coefficients and the * provided variable. */ static double EvalAt(double A, double B, double C, double D, double t) { return std::fma(t, std::fma(t, std::fma(t, A, B), C), D); } static double EvalAt(double coefficients[4], double t) { return EvalAt(coefficients[0], coefficients[1], coefficients[2], coefficients[3], t); } }; #endif