diff --git a/libs/geom/include/psemek/geom/intersection.hpp b/libs/geom/include/psemek/geom/intersection.hpp index e2567707..545bebe5 100644 --- a/libs/geom/include/psemek/geom/intersection.hpp +++ b/libs/geom/include/psemek/geom/intersection.hpp @@ -130,6 +130,30 @@ namespace psemek::geom return !intersection(r, b).empty(); } + template + interval intersection(segment> const & s, box const & b) + { + auto t = interval{T(0), T(1)}; + + 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 (tmin > tmax) std::swap(tmin, tmax); + + t &= interval{tmin, tmax}; + } + + return t; + } + + template + bool intersect(segment> const & s, box const & b) + { + return !intersection(s, b).empty(); + } + template std::optional intersection(ray const & r, simplex, N - 1> const & s) {