diff --git a/libs/geom/include/psemek/geom/intersection.hpp b/libs/geom/include/psemek/geom/intersection.hpp index 5224e0a6..100b8702 100644 --- a/libs/geom/include/psemek/geom/intersection.hpp +++ b/libs/geom/include/psemek/geom/intersection.hpp @@ -211,6 +211,25 @@ namespace psemek::geom return static_cast(intersection(seg, s)); } + template + interval intersection(segment> const & seg, sphere const & s) + { + auto d = seg[0] - s.center; + auto dir = seg[1] - seg[0]; + + auto ir = solve_quadratic(length_sqr(dir), T{2} * dot(dir, d), length_sqr(d) - sqr(s.radius)); + if (!ir) + return {}; + + return {std::max(T{0}, ir->first), std::min(T{1}, ir->second)}; + } + + template + bool intersect(segment> const & seg, sphere const & s) + { + return !intersection(seg, s).empty(); + } + template interval intersection(ray const & r, sphere const & s) {