Add some meshing utilities

This commit is contained in:
Nikita Lisitsa 2020-10-16 07:37:44 +03:00
parent 639f8650d4
commit 10e00d7c92

View file

@ -51,6 +51,78 @@ namespace psemek::geom
return result;
}
template <typename Index = std::uint32_t, typename T>
std::vector<triangle<Index>> faces(box<T, 2> const &)
{
std::vector<triangle<Index>> result;
result.push_back({0, 1, 2});
result.push_back({2, 1, 3});
return result;
}
template <typename Index = std::uint32_t, typename T>
std::vector<triangle<Index>> faces(box<T, 3> const &)
{
std::vector<triangle<Index>> result;
// -Z
result.push_back({0, 2, 1});
result.push_back({1, 2, 3});
// +Z
result.push_back({4, 5, 6});
result.push_back({6, 5, 7});
// -Y
result.push_back({0, 1, 4});
result.push_back({4, 1, 5});
// +Y
result.push_back({2, 6, 3});
result.push_back({6, 7, 3});
// -X
result.push_back({0, 4, 2});
result.push_back({2, 4, 6});
// +X
result.push_back({1, 3, 5});
result.push_back({3, 7, 5});
return result;
}
template <typename Vertex, typename Index, std::size_t N>
std::vector<simplex<Vertex, N>> deindex(std::vector<Vertex> const & vertices, std::vector<simplex<Index, N>> const & simplices)
{
std::vector<simplex<Vertex, N>> result;
result.reserve(simplices.size());
for (auto const & s : simplices)
{
result.emplace_back();
for (std::size_t i = 0; i <= N; ++i)
result.back()[i] = vertices[s[i]];
}
return result;
}
namespace detail
{
template <typename F, typename G, std::size_t ... I>
auto map_index_sequence(F && f, G && g, std::index_sequence<I...>)
{
return f(g(I)...);
}
}
template <typename T, std::size_t N, typename Index>
std::vector<vector<T, N + 1>> flat_normals(std::vector<point<T, N + 1>> const & vertices, std::vector<simplex<Index, N>> const & simplices)
{
std::vector<vector<T, N + 1>> result;
result.reserve(simplices.size());
for (auto const & s : simplices)
{
auto const n = detail::map_index_sequence([&](auto const & ... vs){ return normal(vs...); }, [&](std::size_t i){ return vertices[s[i]]; }, std::make_index_sequence<N + 1>{});
result.push_back(n);
}
return result;
}
template <typename Index = std::uint32_t, typename Vertex>
std::vector<triangle<Index>> triangulate_convex(std::vector<Vertex> const & v)
{