From 0fe44770974c49687272a5f166bd0207761e6f5c Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 16 Sep 2022 19:39:42 +0300 Subject: [PATCH] Add cg::edge_mesh(dcel) and cg::triangle_mesh(dcel) --- libs/cg/include/psemek/cg/dcel.hpp | 54 ++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/libs/cg/include/psemek/cg/dcel.hpp b/libs/cg/include/psemek/cg/dcel.hpp index d987a78d..ab1c7a96 100644 --- a/libs/cg/include/psemek/cg/dcel.hpp +++ b/libs/cg/include/psemek/cg/dcel.hpp @@ -2,6 +2,7 @@ #include #include +#include #include #include @@ -599,4 +600,57 @@ namespace psemek::cg return result; } + template + OutputIterator edge_mesh(dcel const & dcel, OutputIterator out) + { + std::vector visited(dcel.edges.size(), false); + for (Index e = 0; e < dcel.edges.size(); ++e) + { + if (visited[e]) continue; + + auto twin = dcel.edges[e].twin; + + visited[e] = true; + visited[twin] = true; + + auto h = dcel.edge(e); + + *out++ = geom::segment{h.origin().index(), h.twin().origin().index()}; + } + return out; + } + + template + auto edge_mesh(dcel const & dcel) + { + std::vector> result; + edge_mesh(dcel, std::back_inserter(result)); + return result; + } + + template + OutputIterator triangle_mesh(dcel const & dcel, OutputIterator out) + { + for (Index f = 1; f < dcel.faces.size(); ++f) + { + auto h = dcel.face(f).edge(); + + geom::triangle t; + t[0] = h.origin().index(); h = h.next(); + t[1] = h.origin().index(); h = h.next(); + t[2] = h.origin().index(); + + *out++ = t; + } + return out; + } + + template + auto triangle_mesh(dcel const & dcel) + { + std::vector> result; + triangle_mesh(dcel, std::back_inserter(result)); + return result; + } + }