Add a CMake option for robust geom predicates
This commit is contained in:
parent
d250becf43
commit
c87a8a5c71
3 changed files with 27 additions and 3 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -4,7 +4,9 @@
|
|||
#include <psemek/geom/point.hpp>
|
||||
#include <psemek/geom/orientation.hpp>
|
||||
|
||||
#ifdef PSEMEK_GEOM_ROBUST_PREDICATES
|
||||
#include <boost/multiprecision/gmp.hpp>
|
||||
#endif
|
||||
|
||||
#include <type_traits>
|
||||
|
||||
|
|
@ -12,7 +14,11 @@ namespace psemek::geom
|
|||
{
|
||||
|
||||
template <typename T>
|
||||
#ifdef PSEMEK_GEOM_ROBUST_PREDICATES
|
||||
std::enable_if_t<!std::is_floating_point_v<T>, sign_t>
|
||||
#else
|
||||
sign_t
|
||||
#endif
|
||||
in_circle(point<T, 2> const & p0, point<T, 2> const & p1, point<T, 2> const & p2, point<T, 2> const & p3)
|
||||
{
|
||||
auto proj = [](point<T, 2> 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 <typename T>
|
||||
std::enable_if_t<std::is_floating_point_v<T>, sign_t>
|
||||
in_circle(point<T, 2> const & p0, point<T, 2> const & p1, point<T, 2> const & p2, point<T, 2> const & p3)
|
||||
|
|
@ -67,5 +74,6 @@ namespace psemek::geom
|
|||
return in_circle(cast<exact_type>(p0), cast<exact_type>(p1), cast<exact_type>(p2), cast<exact_type>(p3));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,7 +4,9 @@
|
|||
#include <psemek/geom/point.hpp>
|
||||
#include <psemek/geom/sign.hpp>
|
||||
|
||||
#ifdef PSEMEK_GEOM_ROBUST_PREDICATES
|
||||
#include <boost/multiprecision/gmp.hpp>
|
||||
#endif
|
||||
|
||||
#include <limits>
|
||||
#include <type_traits>
|
||||
|
|
@ -14,7 +16,11 @@ namespace psemek::geom
|
|||
|
||||
// TODO: generic implementation
|
||||
template <typename T>
|
||||
#ifdef PSEMEK_GEOM_ROBUST_PREDICATES
|
||||
std::enable_if_t<!std::is_floating_point_v<T>, sign_t>
|
||||
#else
|
||||
sign_t
|
||||
#endif
|
||||
orientation(point<T, 2> const & p0, point<T, 2> const & p1, point<T, 2> 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 <typename T>
|
||||
std::enable_if_t<std::is_floating_point_v<T>, sign_t>
|
||||
orientation(point<T, 2> const & p0, point<T, 2> const & p1, point<T, 2> const & p2)
|
||||
|
|
@ -50,6 +57,7 @@ namespace psemek::geom
|
|||
return orientation(cast<exact_type>(p0), cast<exact_type>(p1), cast<exact_type>(p2));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
template <typename T>
|
||||
sign_t orientation(point<T, 3> const & p0, point<T, 3> const & p1, point<T, 3> const & p2, point<T, 3> const & p3)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue