From d7c9b484fe99340ea451bed55a717013840a8217 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Thu, 14 Mar 2024 14:12:23 +0300 Subject: [PATCH] Add cg::irregular_triangular_prism --- libs/cg/include/psemek/cg/body/prism.hpp | 51 ++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/libs/cg/include/psemek/cg/body/prism.hpp b/libs/cg/include/psemek/cg/body/prism.hpp index a89ee758..4766cdf4 100644 --- a/libs/cg/include/psemek/cg/body/prism.hpp +++ b/libs/cg/include/psemek/cg/body/prism.hpp @@ -86,4 +86,55 @@ namespace psemek::cg return p.edge_directions; } + template + struct irregular_triangular_prism + { + irregular_triangular_prism() = default; + irregular_triangular_prism(geom::triangle> const & low_triangle, geom::triangle> const & high_triangle); + + std::array, 6> vertices; + std::array, 9> edge_directions; + }; + + template + irregular_triangular_prism::irregular_triangular_prism(geom::triangle> const & low_triangle, geom::triangle> 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 + auto const & vertices(irregular_triangular_prism const & p) + { + return p.vertices; + } + + template + auto const & edges(irregular_triangular_prism const &) + { + return edges(triangular_prism{}); + } + + template + auto const & faces(irregular_triangular_prism const &) + { + return faces(triangular_prism{}); + } + + template + auto const & edge_directions(irregular_triangular_prism const & p) + { + return p.edge_directions; + } + }