From a37b0606a822674031ec6fefcde7286d1ab07f04 Mon Sep 17 00:00:00 2001 From: Emmett Lalish Date: Sun, 7 Aug 2022 11:47:09 -0700 Subject: [PATCH] fixed triangulation bug --- src/manifold/src/manifold.cpp | 6 --- src/polygon/src/polygon.cpp | 9 +++- test/mesh_test.cpp | 5 +- test/polygon_test.cpp | 94 +++++++++++++++++++++++++++++++++++ 4 files changed, 103 insertions(+), 11 deletions(-) diff --git a/src/manifold/src/manifold.cpp b/src/manifold/src/manifold.cpp index fe12022b6..f3f10eb22 100644 --- a/src/manifold/src/manifold.cpp +++ b/src/manifold/src/manifold.cpp @@ -36,12 +36,6 @@ struct MakeTri { } }; -struct GetMeshID { - __host__ __device__ void operator()(thrust::tuple inOut) { - thrust::get<0>(inOut) = thrust::get<1>(inOut).meshID; - } -}; - Manifold Halfspace(Box bBox, glm::vec3 normal, float originOffset) { normal = glm::normalize(normal); Manifold cutter = diff --git a/src/polygon/src/polygon.cpp b/src/polygon/src/polygon.cpp index 084226b98..1248a4ce0 100644 --- a/src/polygon/src/polygon.cpp +++ b/src/polygon/src/polygon.cpp @@ -298,6 +298,8 @@ class Monotones { #endif } + float GetPrecision() const { return precision_; } + private: struct VertAdj; typedef std::list::iterator VertItr; @@ -812,7 +814,10 @@ class Monotones { SetVEast(newPair, vert); const int hole = IsHole(vert); if (hole == 0 && IsColinearPoly(vert)) { + PRINT("Skip colinear polygon"); SkipPoly(vert); + activePairs_.erase(newPair); + continue; } isHole = hole > 0; } @@ -1032,7 +1037,9 @@ std::vector Triangulate(const Polygons &polys, float precision) { #ifdef MANIFOLD_DEBUG if (params.intermediateChecks) { CheckTopology(triangles, polys); - CheckGeometry(triangles, polys, precision); + if (!params.processOverlaps) { + CheckGeometry(triangles, polys, 2 * monotones.GetPrecision()); + } } } catch (const geometryErr &e) { if (!params.suppressErrors) { diff --git a/test/mesh_test.cpp b/test/mesh_test.cpp index 2dfa69601..86ddcd3f6 100644 --- a/test/mesh_test.cpp +++ b/test/mesh_test.cpp @@ -1010,8 +1010,6 @@ TEST(Boolean, Subtract) { TEST(Boolean, Close) { PolygonParams().processOverlaps = true; - const bool intermediateChecks = PolygonParams().intermediateChecks; - PolygonParams().intermediateChecks = false; const float r = 10; Manifold a = Manifold::Sphere(r, 256); @@ -1022,7 +1020,7 @@ TEST(Boolean, Close) { EXPECT_TRUE(result.IsManifold()); } auto prop = result.GetProperties(); - const float tol = 0.002; + const float tol = 0.004; EXPECT_NEAR(prop.volume, (4.0f / 3.0f) * glm::pi() * r * r * r, tol * r * r * r); EXPECT_NEAR(prop.surfaceArea, 4 * glm::pi() * r * r, tol * r * r); @@ -1030,5 +1028,4 @@ TEST(Boolean, Close) { if (options.exportModels) ExportMesh("close.glb", result.GetMesh(), {}); PolygonParams().processOverlaps = false; - PolygonParams().intermediateChecks = intermediateChecks; } diff --git a/test/polygon_test.cpp b/test/polygon_test.cpp index 090c862ae..cc2f5af46 100644 --- a/test/polygon_test.cpp +++ b/test/polygon_test.cpp @@ -213,6 +213,100 @@ TEST(Polygon, Merges) { TestPoly(polys, 9); } +TEST(Polygon, ExtraTriangle) { + Polygons polys; + polys.push_back({ + {glm::vec2(1.23141634, -0.493547261), 0}, // + {glm::vec2(1.23142254, -0.493540883), 1}, // + {glm::vec2(1.23088336, -0.457464248), 2}, // + }); + polys.push_back({ + {glm::vec2(1.23146737, -0.493494928), 3}, // + {glm::vec2(1.47253549, -0.24623163), 4}, // + {glm::vec2(1.47253144, -0.246230021), 5}, // + {glm::vec2(1.47166216, -0.246238187), 6}, // + {glm::vec2(1.46963537, -0.24623026), 7}, // + {glm::vec2(1.46811843, -0.246224999), 8}, // + {glm::vec2(1.46594918, -0.246223733), 9}, // + {glm::vec2(1.46594965, -0.246232167), 10}, // + {glm::vec2(1.46594965, -0.246232241), 11}, // + {glm::vec2(1.46594083, -0.246223733), 12}, // + {glm::vec2(1.46591508, -0.246223718), 13}, // + {glm::vec2(1.46594179, -0.246231437), 14}, // + {glm::vec2(1.46585774, -0.246223688), 15}, // + {glm::vec2(1.46577716, -0.246223629), 16}, // + {glm::vec2(1.46590662, -0.246231213), 17}, // + {glm::vec2(1.46550393, -0.246223465), 18}, // + {glm::vec2(1.46081161, -0.246220738), 19}, // + {glm::vec2(1.46407437, -0.246228904), 20}, // + {glm::vec2(1.45568836, -0.246227756), 21}, // + {glm::vec2(1.42199826, -0.260253757), 22}, // + {glm::vec2(1.40801644, -0.246204734), 23}, // + {glm::vec2(1.40688479, -0.24620308), 24}, // + {glm::vec2(1.38571239, -0.246184081), 25}, // + {glm::vec2(1.30817795, -0.246158242), 26}, // + {glm::vec2(1.28997684, -0.328056872), 27}, // + {glm::vec2(1.30974603, -0.315009534), 28}, // + {glm::vec2(1.31756043, -0.364917517), 29}, // + }); + TestPoly(polys, 26); +} + +TEST(Polygon, DISABLED_SpongeThin) { + Polygons polys; + polys.push_back({ + {glm::vec2(-0.5, -0.475308657), 11}, // + {glm::vec2(-0.487654328, -0.475461066), 12}, // + {glm::vec2(-0.487654328, -0.475308657), 13}, // + {glm::vec2(-0.487654328, -0.475308657), 14}, // + {glm::vec2(-0.487654328, -0.475308657), 15}, // + {glm::vec2(-0.475308657, -0.475308657), 16}, // + {glm::vec2(-0.475308657, -0.475613475), 17}, // + {glm::vec2(-0.462962985, -0.475765914), 18}, // + {glm::vec2(-0.462962985, -0.475308657), 19}, // + }); + polys.push_back({ + {glm::vec2(0.42592591, -0.475308657), 20}, // + {glm::vec2(0.351851851, -0.475308657), 21}, // + {glm::vec2(0.351851851, -0.475308657), 22}, // + {glm::vec2(0.351851851, -0.48582533), 23}, // + {glm::vec2(0.364197552, -0.485977769), 24}, // + {glm::vec2(0.364197552, -0.475308657), 25}, // + {glm::vec2(0.364197552, -0.475308657), 26}, // + {glm::vec2(0.364197552, -0.475308657), 27}, // + {glm::vec2(0.376543224, -0.475308657), 28}, // + {glm::vec2(0.376543224, -0.486130178), 29}, // + {glm::vec2(0.401234567, -0.486434996), 30}, // + {glm::vec2(0.401234567, -0.475308657), 31}, // + {glm::vec2(0.401234567, -0.475308657), 32}, // + {glm::vec2(0.401234567, -0.475308657), 33}, // + {glm::vec2(0.413580239, -0.475308657), 34}, // + {glm::vec2(0.413580239, -0.486587405), 35}, // + {glm::vec2(0.42592591, -0.486739844), 36}, // + }); + polys.push_back({ + {glm::vec2(0.314814806, -0.475308657), 37}, // + {glm::vec2(0.240740761, -0.475308657), 38}, // + {glm::vec2(0.240740761, -0.475308657), 39}, // + {glm::vec2(0.240740761, -0.484453589), 40}, // + {glm::vec2(0.253086448, -0.484606028), 41}, // + {glm::vec2(0.253086448, -0.475308657), 42}, // + {glm::vec2(0.253086448, -0.475308657), 43}, // + {glm::vec2(0.253086448, -0.475308657), 44}, // + {glm::vec2(0.265432119, -0.475308657), 45}, // + {glm::vec2(0.265432119, -0.484758437), 46}, // + {glm::vec2(0.290123463, -0.485063255), 47}, // + {glm::vec2(0.290123463, -0.475308657), 48}, // + {glm::vec2(0.290123463, -0.475308657), 49}, // + {glm::vec2(0.290123463, -0.475308657), 50}, // + {glm::vec2(0.302469134, -0.475308657), 51}, // + {glm::vec2(0.302469134, -0.485215664), 52}, // + {glm::vec2(0.314814806, -0.485368103), 53}, // + {glm::vec2(0.314814806, -0.475308657), 54}, // + }); + TestPoly(polys, 7); +} + TEST(Polygon, ColinearY) { Polygons polys; polys.push_back({