From ec86b0c0aa4aed4c1148cc01b8c05cbb3a0a32d8 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Wed, 1 Dec 2021 21:22:00 +0300 Subject: [PATCH] Add geom::signed_distance --- libs/geom/include/psemek/geom/distance.hpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/libs/geom/include/psemek/geom/distance.hpp b/libs/geom/include/psemek/geom/distance.hpp index eb33f94e..c5d9c5a4 100644 --- a/libs/geom/include/psemek/geom/distance.hpp +++ b/libs/geom/include/psemek/geom/distance.hpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace psemek::geom { @@ -17,6 +18,12 @@ namespace psemek::geom return std::min(std::abs(x - i.min), std::abs(x - i.max)); } + template + T signed_distance(T const & x, interval const & i) + { + return std::max(i.min - x, x - i.max); + } + template T distance(point const & p, box const & b) { @@ -31,6 +38,18 @@ namespace psemek::geom return std::sqrt(s); } + template + T signed_distance(point const & p, box const & b) + { + if (!contains(b, p)) + return distance(p, b); + + T s = limits::min(); + for (std::size_t i = 0; i < N; ++i) + s = std::max(s, signed_distance(p[i], b[i])); + return s; + } + template T distance(point const & p, segment> const & s) {