From 57908e1249554e5fb670d126c15061f6dcfb4133 Mon Sep 17 00:00:00 2001 From: hazzlerr <127759611+hazzlerr@users.noreply.github.com> Date: Fri, 15 Nov 2024 18:04:19 -0500 Subject: [PATCH 1/2] Fixed face order check --- src/geometry/planar.md | 20 +++++++------------- 1 file changed, 7 insertions(+), 13 deletions(-) diff --git a/src/geometry/planar.md b/src/geometry/planar.md index 57c91ae2d..017399a7c 100644 --- a/src/geometry/planar.md +++ b/src/geometry/planar.md @@ -125,20 +125,14 @@ std::vector> find_faces(std::vector vertices, std::ve e = e1; } std::reverse(face.begin(), face.end()); - int sign = 0; - for (size_t j = 0; j < face.size(); j++) { - size_t j1 = (j + 1) % face.size(); - size_t j2 = (j + 2) % face.size(); - int64_t val = vertices[face[j]].cross(vertices[face[j1]], vertices[face[j2]]); - if (val > 0) { - sign = 1; - break; - } else if (val < 0) { - sign = -1; - break; - } + Point p1 = vertices[face[0]]; + __int128 sum = 0; + for (int j = 0; j < face.size(); ++j) { + Point p2 = vertices[face[j]]; + Point p3 = vertices[face[(j + 1) % face.size()]]; + sum += (p2 - p1).cross(p3 - p2); } - if (sign <= 0) { + if (sum <= 0) { faces.insert(faces.begin(), face); } else { faces.emplace_back(face); From 5b1d6f6a26e2b2dd8531f0551ed6800c62d81670 Mon Sep 17 00:00:00 2001 From: hazzlerr <127759611+hazzlerr@users.noreply.github.com> Date: Mon, 18 Nov 2024 10:12:00 -0500 Subject: [PATCH 2/2] Update test_planar_faces.cpp --- test/test_planar_faces.cpp | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/test/test_planar_faces.cpp b/test/test_planar_faces.cpp index 731bae4db..662c88cfb 100644 --- a/test/test_planar_faces.cpp +++ b/test/test_planar_faces.cpp @@ -93,8 +93,34 @@ void test_cycle_with_chain() { assert(equal_cycles(faces[1], {2, 5, 4, 5, 2, 1, 0, 3})); } +void test_ccw_angle() { + std::vector p = { + Point(0, 2), + Point(1, 3), + Point(0, 1), + Point(1, 0), + Point(-1, 0), + Point(-1, 3) + }; + + std::vector> adj = { + {1, 5}, + {0, 2}, + {1, 3}, + {2, 4}, + {3, 5}, + {0, 4} + }; + + auto faces = find_faces(p, adj); + assert(faces.size() == 2u); + assert(equal_cycles(faces[0], {0, 1, 2, 3, 4, 5})); + assert(equal_cycles(faces[1], {5, 4, 3, 2, 1, 0})); +} + int main() { test_simple(); test_degenerate(); test_cycle_with_chain(); + test_ccw_angle(); } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy