From 81cafa6f054665b0aad7ca782db5b1f1380cb4af Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sat, 26 Sep 2020 23:23:40 +0300 Subject: [PATCH] Add ray-simplex intersection --- .../geom/include/psemek/geom/intersection.hpp | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/libs/geom/include/psemek/geom/intersection.hpp b/libs/geom/include/psemek/geom/intersection.hpp index dbb72cf2..22fbe183 100644 --- a/libs/geom/include/psemek/geom/intersection.hpp +++ b/libs/geom/include/psemek/geom/intersection.hpp @@ -7,7 +7,9 @@ #include #include #include +#include +#include #include #include @@ -128,4 +130,42 @@ namespace psemek::geom return !intersection(r, b).empty(); } + template + std::optional intersection(ray const & r, simplex, N - 1> const & s) + { + geom::matrix m; + geom::vector b; + + for (std::size_t i = 0; i < N; ++i) + { + m[i][0] = r.direction[i]; + b[i] = s[0][i] - r.origin[i]; + + for (std::size_t j = 1; j < N; ++j) + { + m[i][j] = s[j][i] - s[0][i]; + } + } + + if (!geom::gauss(m, b)) + return std::nullopt; + + T sum{}; + for (std::size_t j = 1; j < N; ++j) + { + if (b[j] >= T{}) return std::nullopt; + sum += (-b[j]); + } + + if (sum > T{1}) return std::nullopt; + + return b[0]; + } + + template + bool intersect(ray const & r, simplex const & s) + { + return static_cast(intersection(r, s)); + } + }