Add segment-sphere intersection

This commit is contained in:
Nikita Lisitsa 2022-02-21 13:05:35 +03:00
parent 7a14ee82e6
commit b4584f758d

View file

@ -211,6 +211,25 @@ namespace psemek::geom
return static_cast<bool>(intersection(seg, s));
}
template <typename T, std::size_t N>
interval<T> intersection(segment<point<T, N>> const & seg, sphere<T, N> 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 <typename T, std::size_t N>
bool intersect(segment<point<T, N>> const & seg, sphere<T, N> const & s)
{
return !intersection(seg, s).empty();
}
template <typename T, std::size_t N>
interval<T> intersection(ray<T, N> const & r, sphere<T, N> const & s)
{