diff --git a/libs/geom/include/psemek/geom/orientation.hpp b/libs/geom/include/psemek/geom/orientation.hpp index ab77c9aa..63303bdb 100644 --- a/libs/geom/include/psemek/geom/orientation.hpp +++ b/libs/geom/include/psemek/geom/orientation.hpp @@ -14,25 +14,6 @@ namespace psemek::geom { - // TODO: generic implementation - template -#ifdef PSEMEK_GEOM_ROBUST_PREDICATES - std::enable_if_t, sign_t> -#else - sign_t -#endif - orientation(point const & p0, point const & p1, point const & p2) - { - T const d = det(p1 - p0, p2 - p0); - - if (d > T{}) - return sign_t::positive; - else if (d < T{}) - return sign_t::negative; - else - return sign_t::zero; - } - #ifdef PSEMEK_GEOM_ROBUST_PREDICATES template std::enable_if_t, sign_t> @@ -59,10 +40,15 @@ namespace psemek::geom } #endif - template - sign_t orientation(point const & p0, point const & p1, point const & p2, point const & p3) + template +#ifdef PSEMEK_GEOM_ROBUST_PREDICATES + std::enable_if_t, sign_t> +#else + sign_t +#endif + orientation(vector const & v1, Vectors const & ... vs) { - T const d = det(p0 - p3, p1 - p3, p2 - p3); + T const d = det(v1, vs...); if (d > T{}) return sign_t::positive; @@ -72,4 +58,24 @@ namespace psemek::geom return sign_t::zero; } + template +#ifdef PSEMEK_GEOM_ROBUST_PREDICATES + std::enable_if_t, sign_t> +#else + sign_t +#endif + orientation(point const & p0, Points const & ... ps) + { + auto o = orientation((ps - p0)...); + + if constexpr ((N % 2) == 0) + { + return o; + } + else + { + return inverse(o); + } + } + } diff --git a/libs/geom/include/psemek/geom/sign.hpp b/libs/geom/include/psemek/geom/sign.hpp index 3ba9fc4f..3255d1f4 100644 --- a/libs/geom/include/psemek/geom/sign.hpp +++ b/libs/geom/include/psemek/geom/sign.hpp @@ -23,4 +23,14 @@ namespace psemek::geom return o; } + inline sign_t inverse(sign_t s) + { + switch (s) + { + case sign_t::positive: return sign_t::negative; + case sign_t::zero: return sign_t::zero; + case sign_t::negative: return sign_t::positive; + } + } + }