From b4584f758d8eef4165b5dfff83f98b364b5f2b71 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Mon, 21 Feb 2022 13:05:35 +0300 Subject: [PATCH] Add segment-sphere intersection --- .../geom/include/psemek/geom/intersection.hpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) 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) {