From 4bb287eb705615695444c85ce70073ee91a37f75 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 30 Sep 2020 07:22:27 +0300 Subject: [PATCH] Add n-dim versions of orientation(points) and add orientation(vectors) --- libs/geom/include/psemek/geom/orientation.hpp | 50 +++++++++++-------- libs/geom/include/psemek/geom/sign.hpp | 10 ++++ 2 files changed, 38 insertions(+), 22 deletions(-) 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; + } + } + }