From 119865389173c155ff4824e2b0a6d1d9e6e80833 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Fri, 16 Dec 2022 01:55:21 +0300 Subject: [PATCH] Tweak polygon ear clipping to behave well with duplicate vertices --- .../include/psemek/cg/triangulation/ear_clipping.hpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/libs/cg/include/psemek/cg/triangulation/ear_clipping.hpp b/libs/cg/include/psemek/cg/triangulation/ear_clipping.hpp index 3490e7d8..d9b3a408 100644 --- a/libs/cg/include/psemek/cg/triangulation/ear_clipping.hpp +++ b/libs/cg/include/psemek/cg/triangulation/ear_clipping.hpp @@ -47,6 +47,15 @@ namespace psemek::cg result.edges[i + count].twin = i; } + auto inside = [robust_tag](auto const & t, auto const & p) + { + return true + && geom::orientation(robust_tag, t[0], t[1], p) == geom::sign_t::positive + && geom::orientation(robust_tag, t[1], t[2], p) == geom::sign_t::positive + && geom::orientation(robust_tag, t[2], t[0], p) == geom::sign_t::positive + ; + }; + auto edge = result.edge(0); for (IndexType i = 0; i + 3 < count; ++i) { @@ -64,7 +73,7 @@ namespace psemek::cg for (auto k = nnext.next(); k != edge; k = k.next()) { - if (geom::contains(triangle, at(k.origin().index()))) + if (inside(triangle, at(k.origin().index()))) { ear = false; break;