Add point-triangle distance
This commit is contained in:
parent
e4be2e9322
commit
dfcec0a1ee
1 changed files with 31 additions and 0 deletions
|
|
@ -4,6 +4,7 @@
|
||||||
#include <psemek/geom/box.hpp>
|
#include <psemek/geom/box.hpp>
|
||||||
#include <psemek/geom/math.hpp>
|
#include <psemek/geom/math.hpp>
|
||||||
#include <psemek/geom/simplex.hpp>
|
#include <psemek/geom/simplex.hpp>
|
||||||
|
#include <psemek/geom/gauss.hpp>
|
||||||
|
|
||||||
namespace psemek::geom
|
namespace psemek::geom
|
||||||
{
|
{
|
||||||
|
|
@ -35,4 +36,34 @@ namespace psemek::geom
|
||||||
return distance(p, lerp(s[0], s[1], t));
|
return distance(p, lerp(s[0], s[1], t));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T, std::size_t N>
|
||||||
|
T distance(point<T, N> const & p, triangle<point<T, N>> const & s)
|
||||||
|
{
|
||||||
|
auto n = normal(s[0], s[1], s[2]);
|
||||||
|
auto v = p - s[0];
|
||||||
|
auto l = dot(n, v);
|
||||||
|
v -= n * l;
|
||||||
|
|
||||||
|
matrix<T, 3, 2> m;
|
||||||
|
|
||||||
|
for (std::size_t i = 0; i < 3; ++i)
|
||||||
|
{
|
||||||
|
m[i][0] = (s[1] - s[0])[i];
|
||||||
|
m[i][1] = (s[2] - s[0])[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
auto res = least_squares(m, v);
|
||||||
|
|
||||||
|
if (res)
|
||||||
|
{
|
||||||
|
auto u = *res;
|
||||||
|
if (u[0] >= 0 && u[1] >= 0 && u[0] + u[1] <= 1)
|
||||||
|
{
|
||||||
|
return std::abs(l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return std::min(distance(p, simplex{s[0], s[1]}), std::min(distance(p, simplex{s[1], s[2]}), distance(p, simplex{s[2], s[0]})));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue