From db1ac4a3b0a839f1dc78f419e9b7c4aaf7a79998 Mon Sep 17 00:00:00 2001 From: Andrey Prokopenko Date: Sat, 1 Feb 2025 16:10:41 -0500 Subject: [PATCH] Add segment-box intersection --- src/geometry/algorithms/ArborX_Intersects.hpp | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/geometry/algorithms/ArborX_Intersects.hpp b/src/geometry/algorithms/ArborX_Intersects.hpp index 19c85825f..ca3ca900c 100644 --- a/src/geometry/algorithms/ArborX_Intersects.hpp +++ b/src/geometry/algorithms/ArborX_Intersects.hpp @@ -476,6 +476,42 @@ struct intersects } }; +template +struct intersects +{ + KOKKOS_FUNCTION static constexpr bool apply(Segment const &segment, + Box const &box) + { + static_assert(GeometryTraits::dimension_v == 2); + + if (Details::intersects(segment.a, box) || + Details::intersects(segment.b, box)) + return true; + + using Point = std::decay_t; + + auto const &bottom_left = box.minCorner(); + auto const &top_right = box.maxCorner(); + auto const top_left = Point{bottom_left[0], top_right[1]}; + auto const bottom_right = Point{top_right[0], bottom_left[1]}; + + return Details::intersects(segment, Segment{bottom_left, top_left}) || + Details::intersects(segment, Segment{bottom_left, bottom_right}) || + Details::intersects(segment, Segment{top_right, top_left}) || + Details::intersects(segment, Segment{top_right, bottom_right}); + } +}; + +template +struct intersects +{ + KOKKOS_FUNCTION static constexpr bool apply(Box const &box, + Segment const &segment) + { + return Details::intersects(segment, box); + } +}; + } // namespace Dispatch } // namespace ArborX::Details