From e0312b66b1fa45eb0af75c2ee04ba733e5f54908 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 23 Dec 2021 10:56:58 +0300 Subject: [PATCH] Fix ray-sphere intersection: return an interval --- libs/geom/include/psemek/geom/intersection.hpp | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/libs/geom/include/psemek/geom/intersection.hpp b/libs/geom/include/psemek/geom/intersection.hpp index dc8d8324..3a697e8f 100644 --- a/libs/geom/include/psemek/geom/intersection.hpp +++ b/libs/geom/include/psemek/geom/intersection.hpp @@ -211,17 +211,21 @@ namespace psemek::geom } template - std::optional> intersection(ray const & r, sphere const & s) + interval intersection(ray const & r, sphere const & s) { auto d = r.origin - s.center; - return solve_quadratic(length_sqr(r.direction), T{2} * dot(r.direction, d), length_sqr(d) - sqr(s.radius)); + auto ir = solve_quadratic(length_sqr(r.direction), T{2} * dot(r.direction, d), length_sqr(d) - sqr(s.radius)); + if (!ir) + return {}; + + return {ir->first, ir->second}; } - template 2)>> + template bool intersect(ray const & r, sphere const & s) { - return static_cast(intersection(r, s)); + return intersection(r, s).empty(); } }