From 87b2d80aabb6b4e6effc423a350963395f528f3c Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Thu, 6 Feb 2025 19:38:20 +0000 Subject: Verify an edge can be flipped Asserts the resulting triangle pair would be both still face up, not the case if the original triangles do not form a convex polygon --- game/geoData.cpp | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'game') diff --git a/game/geoData.cpp b/game/geoData.cpp index 5f098e4..74ededa 100644 --- a/game/geoData.cpp +++ b/game/geoData.cpp @@ -534,9 +534,18 @@ GeoData::setHeights(const std::span triangleStrip, const } return nullptr; }; - const auto shouldFlip - = [this](const HalfedgeHandle next, const GlobalPosition2D startPoint) -> std::optional { - if (const auto nextEdge = edge_handle(next); is_flip_ok(nextEdge)) { + const auto canFlip = [this](const HalfedgeHandle edge) { + const auto opposite = opposite_halfedge_handle(edge); + const auto pointA = point(to_vertex_handle(edge)); + const auto pointB = point(to_vertex_handle(opposite)); + const auto pointC = point(to_vertex_handle(next_halfedge_handle(edge))); + const auto pointD = point(to_vertex_handle(next_halfedge_handle(opposite))); + + return Triangle<2> {pointC, pointB, pointD}.isUp() && Triangle<2> {pointA, pointC, pointD}.isUp(); + }; + const auto shouldFlip = [this, &canFlip](const HalfedgeHandle next, + const GlobalPosition2D startPoint) -> std::optional { + if (const auto nextEdge = edge_handle(next); is_flip_ok(nextEdge) && canFlip(next)) { const auto opposite_point = point(to_vertex_handle(next_halfedge_handle(opposite_halfedge_handle(next)))).xy(); if (distance<2>(startPoint, opposite_point) < length<2>(next)) { -- cgit v1.2.3