diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-02-06 19:38:20 +0000 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2025-02-06 19:38:20 +0000 |
commit | 87b2d80aabb6b4e6effc423a350963395f528f3c (patch) | |
tree | b6b6199b92d69ebe613d7987a14610f431e37e3d /game/geoData.cpp | |
parent | Update PointFace _face cache as required instead of erroring (diff) | |
download | ilt-87b2d80aabb6b4e6effc423a350963395f528f3c.tar.bz2 ilt-87b2d80aabb6b4e6effc423a350963395f528f3c.tar.xz ilt-87b2d80aabb6b4e6effc423a350963395f528f3c.zip |
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
Diffstat (limited to 'game/geoData.cpp')
-rw-r--r-- | game/geoData.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
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<const GlobalPosition3D> triangleStrip, const } return nullptr; }; - const auto shouldFlip - = [this](const HalfedgeHandle next, const GlobalPosition2D startPoint) -> std::optional<EdgeHandle> { - 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<EdgeHandle> { + 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)) { |