From 0cb197a6c4fb07925f850c9af232bf6d73601e2a Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 19 Jun 2022 22:25:56 +0300 Subject: [PATCH] Fix geom::intersection(segment,box) for axis-aligned segments --- libs/geom/include/psemek/geom/intersection.hpp | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/libs/geom/include/psemek/geom/intersection.hpp b/libs/geom/include/psemek/geom/intersection.hpp index 100b8702..72a85e00 100644 --- a/libs/geom/include/psemek/geom/intersection.hpp +++ b/libs/geom/include/psemek/geom/intersection.hpp @@ -139,12 +139,20 @@ namespace psemek::geom for (std::size_t i = 0; i < N; ++i) { - T tmin = (b[i].min - s[0][i]) / (s[1][i] - s[0][i]); - T tmax = (b[i].max - s[0][i]) / (s[1][i] - s[0][i]); + if (s[1][i] != s[0][i]) + { + T tmin = (b[i].min - s[0][i]) / (s[1][i] - s[0][i]); + T tmax = (b[i].max - s[0][i]) / (s[1][i] - s[0][i]); - if (tmin > tmax) std::swap(tmin, tmax); + if (tmin > tmax) std::swap(tmin, tmax); - t &= interval{tmin, tmax}; + t &= interval{tmin, tmax}; + } + else + { + if (!contains(b[i], s[0][i])) + return interval{}; + } } return t;