From 67e2cd13855356837c2cedb444b3113524fe3098 Mon Sep 17 00:00:00 2001 From: Lucile Remigy <lucile.remigy@epitech.eu> Date: Thu, 26 Sep 2019 15:56:24 +0200 Subject: [PATCH] delete PolySolver --- include/hpp/fcl/intersect.h | 41 +++--------- src/intersect.cpp | 128 ------------------------------------ 2 files changed, 9 insertions(+), 160 deletions(-) diff --git a/include/hpp/fcl/intersect.h b/include/hpp/fcl/intersect.h index b56a6c62..fd8dfd55 100644 --- a/include/hpp/fcl/intersect.h +++ b/include/hpp/fcl/intersect.h @@ -41,42 +41,19 @@ #include <hpp/fcl/math/transform.h> #include <boost/math/special_functions/erf.hpp> -namespace hpp -{ +namespace hpp +{ namespace fcl { -/// @brief A class solves polynomial degree (1,2,3) equations -class PolySolver +/// @brief CCD intersect kernel among primitives +class Intersect { public: - /// @brief Solve a linear equation with coefficients c, return roots s and number of roots - static int solveLinear(FCL_REAL c[2], FCL_REAL s[1]); - - /// @brief Solve a quadratic function with coefficients c, return roots s and number of roots - static int solveQuadric(FCL_REAL c[3], FCL_REAL s[2]); - - /// @brief Solve a cubic function with coefficients c, return roots s and number of roots - static int solveCubic(FCL_REAL c[4], FCL_REAL s[3]); - -private: - /// @brief Check whether v is zero - static inline bool isZero(FCL_REAL v); + static bool buildTrianglePlane + (const Vec3f& v1, const Vec3f& v2, const Vec3f& v3, Vec3f* n, FCL_REAL* t); +}; // class Intersect - /// @brief Compute v^{1/3} - static inline bool cbrt(FCL_REAL v); - - static const FCL_REAL NEAR_ZERO_THRESHOLD; -}; - -/// @brief CCD intersect kernel among primitives -class Intersect -{ -public: - static bool buildTrianglePlane - (const Vec3f& v1, const Vec3f& v2, const Vec3f& v3, Vec3f* n, FCL_REAL* t); -}; // class Intersect - /// @brief Project functions class Project { @@ -213,6 +190,6 @@ public: } -} // namespace hpp - +} // namespace hpp + #endif diff --git a/src/intersect.cpp b/src/intersect.cpp index 15df43fc..1002ed98 100644 --- a/src/intersect.cpp +++ b/src/intersect.cpp @@ -46,134 +46,6 @@ namespace hpp { namespace fcl { -const FCL_REAL PolySolver::NEAR_ZERO_THRESHOLD = 1e-9; - - -bool PolySolver::isZero(FCL_REAL v) -{ - return (v < NEAR_ZERO_THRESHOLD) && (v > -NEAR_ZERO_THRESHOLD); -} - -bool PolySolver::cbrt(FCL_REAL v) -{ - return powf((float) v, (float) (1.0 / 3.0)); -} - -int PolySolver::solveLinear(FCL_REAL c[2], FCL_REAL s[1]) -{ - if(isZero(c[1])) - return 0; - s[0] = - c[0] / c[1]; - return 1; -} - -int PolySolver::solveQuadric(FCL_REAL c[3], FCL_REAL s[2]) -{ - FCL_REAL p, q, D; - - // make sure we have a d2 equation - - if(isZero(c[2])) - return solveLinear(c, s); - - // normal for: x^2 + px + q - p = c[1] / (2.0 * c[2]); - q = c[0] / c[2]; - D = p * p - q; - - if(isZero(D)) - { - // one FCL_REAL root - s[0] = s[1] = -p; - return 1; - } - - if(D < 0.0) - // no real root - return 0; - else - { - // two real roots - FCL_REAL sqrt_D = sqrt(D); - s[0] = sqrt_D - p; - s[1] = -sqrt_D - p; - return 2; - } -} - -int PolySolver::solveCubic(FCL_REAL c[4], FCL_REAL s[3]) -{ - int i, num; - FCL_REAL sub, A, B, C, sq_A, p, q, cb_p, D; - const FCL_REAL ONE_OVER_THREE = 1 / 3.0; - const FCL_REAL PI = 3.14159265358979323846; - - // make sure we have a d2 equation - if(isZero(c[3])) - return solveQuadric(c, s); - - // normalize the equation:x ^ 3 + Ax ^ 2 + Bx + C = 0 - A = c[2] / c[3]; - B = c[1] / c[3]; - C = c[0] / c[3]; - - // substitute x = y - A / 3 to eliminate the quadratic term: x^3 + px + q = 0 - sq_A = A * A; - p = (-ONE_OVER_THREE * sq_A + B) * ONE_OVER_THREE; - q = 0.5 * (2.0 / 27.0 * A * sq_A - ONE_OVER_THREE * A * B + C); - - // use Cardano's formula - cb_p = p * p * p; - D = q * q + cb_p; - - if(isZero(D)) - { - if(isZero(q)) - { - // one triple solution - s[0] = 0.0; - num = 1; - } - else - { - // one single and one FCL_REAL solution - FCL_REAL u = cbrt(-q); - s[0] = 2.0 * u; - s[1] = -u; - num = 2; - } - } - else - { - if(D < 0.0) - { - // three real solutions - FCL_REAL phi = ONE_OVER_THREE * acos(-q / sqrt(-cb_p)); - FCL_REAL t = 2.0 * sqrt(-p); - s[0] = t * cos(phi); - s[1] = -t * cos(phi + PI / 3.0); - s[2] = -t * cos(phi - PI / 3.0); - num = 3; - } - else - { - // one real solution - FCL_REAL sqrt_D = sqrt(D); - FCL_REAL u = cbrt(sqrt_D + fabs(q)); - if(q > 0.0) - s[0] = - u + p / u ; - else - s[0] = u - p / u; - num = 1; - } - } - - // re-substitute - sub = ONE_OVER_THREE * A; - for(i = 0; i < num; i++) - s[i] -= sub; - return num; -} bool Intersect::buildTrianglePlane (const Vec3f& v1, const Vec3f& v2, const Vec3f& v3, Vec3f* n, FCL_REAL* t) -- GitLab