Add cg::irregular_triangular_prism

This commit is contained in:
Nikita Lisitsa 2024-03-14 14:12:23 +03:00
parent 718d0c7d04
commit d7c9b484fe

View file

@ -86,4 +86,55 @@ namespace psemek::cg
return p.edge_directions; return p.edge_directions;
} }
template <typename T>
struct irregular_triangular_prism
{
irregular_triangular_prism() = default;
irregular_triangular_prism(geom::triangle<geom::point<T, 3>> const & low_triangle, geom::triangle<geom::point<T, 3>> const & high_triangle);
std::array<geom::point<T, 3>, 6> vertices;
std::array<geom::vector<T, 3>, 9> edge_directions;
};
template <typename T>
irregular_triangular_prism<T>::irregular_triangular_prism(geom::triangle<geom::point<T, 3>> const & low_triangle, geom::triangle<geom::point<T, 3>> const & high_triangle)
{
for (std::size_t i = 0; i < 3; ++i)
{
vertices[i] = low_triangle[i];
vertices[i + 3] = high_triangle[i];
}
for (std::size_t i = 0; i < 3; ++i)
{
edge_directions[i + 0] = geom::normalized(vertices[(i + 1) % 3] - vertices[i]);
edge_directions[i + 3] = geom::normalized(vertices[3 + ((i + 1) % 3)] - vertices[3 + i]);
edge_directions[i + 6] = geom::normalized(vertices[i + 3] - vertices[i]);
}
}
template <typename T>
auto const & vertices(irregular_triangular_prism<T> const & p)
{
return p.vertices;
}
template <typename T>
auto const & edges(irregular_triangular_prism<T> const &)
{
return edges(triangular_prism<T>{});
}
template <typename T>
auto const & faces(irregular_triangular_prism<T> const &)
{
return faces(triangular_prism<T>{});
}
template <typename T>
auto const & edge_directions(irregular_triangular_prism<T> const & p)
{
return p.edge_directions;
}
} }