From c87a8a5c713a5863fe4cbe24bd26dbd45a443650 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 14 Sep 2020 15:30:09 +0300 Subject: [PATCH] Add a CMake option for robust geom predicates --- libs/geom/CMakeLists.txt | 14 +++++++++++--- libs/geom/include/psemek/geom/incircle.hpp | 8 ++++++++ libs/geom/include/psemek/geom/orientation.hpp | 8 ++++++++ 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/libs/geom/CMakeLists.txt b/libs/geom/CMakeLists.txt index 2493f342..814df922 100644 --- a/libs/geom/CMakeLists.txt +++ b/libs/geom/CMakeLists.txt @@ -1,9 +1,17 @@ -find_package(Boost REQUIRED) -find_package(GMP REQUIRED) +option(PSEMEK_GEOM_ROBUST_PREDICATES "Use robust geometric predicates" OFF) + +if(PSEMEK_GEOM_ROBUST_PREDICATES) + find_package(Boost REQUIRED) + find_package(GMP REQUIRED) +endif() file(GLOB_RECURSE PSEMEK_GEOM_HEADERS "include/*.hpp") file(GLOB_RECURSE PSEMEK_GEOM_SOURCES "source/*.cpp") add_library(geom ${PSEMEK_GEOM_HEADERS} ${PSEMEK_GEOM_SOURCES}) target_include_directories(geom PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include") -target_link_libraries(geom PUBLIC util Boost::boost GMP) +target_link_libraries(geom PUBLIC util) +if(PSEMEK_GEOM_ROBUST_PREDICATES) + target_link_libraries(geom PUBLIC Boost::boost GMP) + target_compile_definitions(geom PUBLIC -DPSEMEK_GEOM_ROBUST_PREDICATES=1) +endif() diff --git a/libs/geom/include/psemek/geom/incircle.hpp b/libs/geom/include/psemek/geom/incircle.hpp index 7491724f..92e5ed24 100644 --- a/libs/geom/include/psemek/geom/incircle.hpp +++ b/libs/geom/include/psemek/geom/incircle.hpp @@ -4,7 +4,9 @@ #include #include +#ifdef PSEMEK_GEOM_ROBUST_PREDICATES #include +#endif #include @@ -12,7 +14,11 @@ namespace psemek::geom { template +#ifdef PSEMEK_GEOM_ROBUST_PREDICATES std::enable_if_t, sign_t> +#else + sign_t +#endif in_circle(point const & p0, point const & p1, point const & p2, point const & p3) { auto proj = [](point const & p) @@ -25,6 +31,7 @@ namespace psemek::geom return orientation(proj(p0), proj(p1), proj(p2), proj(p3)); } +#ifdef PSEMEK_GEOM_ROBUST_PREDICATES template std::enable_if_t, sign_t> in_circle(point const & p0, point const & p1, point const & p2, point const & p3) @@ -67,5 +74,6 @@ namespace psemek::geom return in_circle(cast(p0), cast(p1), cast(p2), cast(p3)); } } +#endif } diff --git a/libs/geom/include/psemek/geom/orientation.hpp b/libs/geom/include/psemek/geom/orientation.hpp index 41d9a452..ab77c9aa 100644 --- a/libs/geom/include/psemek/geom/orientation.hpp +++ b/libs/geom/include/psemek/geom/orientation.hpp @@ -4,7 +4,9 @@ #include #include +#ifdef PSEMEK_GEOM_ROBUST_PREDICATES #include +#endif #include #include @@ -14,7 +16,11 @@ 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); @@ -27,6 +33,7 @@ namespace psemek::geom return sign_t::zero; } +#ifdef PSEMEK_GEOM_ROBUST_PREDICATES template std::enable_if_t, sign_t> orientation(point const & p0, point const & p1, point const & p2) @@ -50,6 +57,7 @@ namespace psemek::geom return orientation(cast(p0), cast(p1), cast(p2)); } } +#endif template sign_t orientation(point const & p0, point const & p1, point const & p2, point const & p3)