From 9ce58f111437dcd077733dbd122cdaa0f99fa48d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Mon, 10 Dec 2018 08:52:20 +0100 Subject: [PATCH 1/3] =?UTF-8?q?-=20Fixed=20PolyConnectivity=20is=5Fcollaps?= =?UTF-8?q?e=5Fok,=20missing=20some=20configurations=20(Thanks=20to=20Simo?= =?UTF-8?q?n=20Fl=C3=B6ry=20for=20the=20patch)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Unittests/unittests_polymesh_collapse.cc | 70 ++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 src/Unittests/unittests_polymesh_collapse.cc diff --git a/src/Unittests/unittests_polymesh_collapse.cc b/src/Unittests/unittests_polymesh_collapse.cc new file mode 100644 index 00000000..594dd1b6 --- /dev/null +++ b/src/Unittests/unittests_polymesh_collapse.cc @@ -0,0 +1,70 @@ +#include +#include + +#include + +namespace { + +class OpenMeshCollapsePoly : public OpenMeshBasePoly { + + protected: + + // This function is called before each test is run + virtual void SetUp() { + } + + // This function is called after all tests are through + virtual void TearDown() { + + // Do some final stuff with the member data here... + } + + // Member already defined in OpenMeshBase + //Mesh mesh_; +}; + +/* + * ==================================================================== + * Define tests below + * ==================================================================== + */ + + + + +/* + * This code tests is_collapse_ok on a double sided triangle. The + * test mesh comprises three vertices, that are connected to form two + * triangles of opposite orientation. All halfedges should be non collapsable. + */ +TEST_F(OpenMeshCollapsePoly, CheckCollapseOkDoublesidedTriangle) { + + mesh_.clear(); + + Mesh::VertexHandle vh0 = mesh_.add_vertex(Mesh::Point(0,0,0)); + Mesh::VertexHandle vh1 = mesh_.add_vertex(Mesh::Point(1,0,0)); + Mesh::VertexHandle vh2 = mesh_.add_vertex(Mesh::Point(1,1,0)); + mesh_.add_face(vh0, vh1, vh2); + mesh_.add_face(vh0, vh2, vh1); + + + + mesh_.request_vertex_status(); + mesh_.request_face_status(); + mesh_.request_edge_status(); + + int collapsable = 0; + + for ( const auto hh : mesh_.all_halfedges() ) + { + if (mesh_.is_collapse_ok(hh) ) + collapsable++; + } + + + EXPECT_EQ(collapsable,0) << "No collapse should be ok when we have only a double sided Triangle"; +} + + + +} -- GitLab From ce071bff3720e8df774b37e2894372eec7b0327e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Mon, 10 Dec 2018 08:53:42 +0100 Subject: [PATCH 2/3] Updated changelog --- Doc/changelog.docu | 1 + 1 file changed, 1 insertion(+) diff --git a/Doc/changelog.docu b/Doc/changelog.docu index 52ebd96b..2de118e8 100644 --- a/Doc/changelog.docu +++ b/Doc/changelog.docu @@ -17,6 +17,7 @@ Core
  • TriConnectivity: Added two functions split_edge and split_edge_copy to mask the PolyConnectivity functions of the same name (Prevents creation of valence 2 vertices on trimeshes)
  • +
  • PolyConnectivity: Fixed PolyConnectivity is_collapse_ok, missing some configurations (Thanks to Simon Flöry for the patch)
IO -- GitLab From 617b5e78de82c2e8dbb0dbb01b385a2c79214fb9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20M=C3=B6bius?= Date: Mon, 10 Dec 2018 08:54:25 +0100 Subject: [PATCH 3/3] =?UTF-8?q?Fixed=20PolyConnectivity=20is=5Fcollapse=5F?= =?UTF-8?q?ok,=20missing=20some=20configurations=20(Thanks=20to=20Simon=20?= =?UTF-8?q?Fl=C3=B6ry=20for=20the=20patch)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/OpenMesh/Core/Mesh/PolyConnectivity.cc | 15 +++++++++++---- src/Unittests/unittests_trimesh_collapse.cc | 1 - 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/OpenMesh/Core/Mesh/PolyConnectivity.cc b/src/OpenMesh/Core/Mesh/PolyConnectivity.cc index e311f5cb..d8de07fc 100644 --- a/src/OpenMesh/Core/Mesh/PolyConnectivity.cc +++ b/src/OpenMesh/Core/Mesh/PolyConnectivity.cc @@ -364,14 +364,16 @@ bool PolyConnectivity::is_collapse_ok(HalfedgeHandle v0v1) //the edges v1-vl and vl-v0 must not be both boundary edges //this test makes only sense in a polymesh if the side face is a triangle + VertexHandle vl; if (!is_boundary(v0v1)) { if (v0v1_triangle) { - //VertexHandle vl = to_vertex_handle(next_halfedge_handle(v0v1)); - HalfedgeHandle h1 = next_halfedge_handle(v0v1); HalfedgeHandle h2 = next_halfedge_handle(h1); + + vl = to_vertex_handle(h1); + if (is_boundary(opposite_halfedge_handle(h1)) && is_boundary(opposite_halfedge_handle(h2))) return false; } @@ -379,19 +381,24 @@ bool PolyConnectivity::is_collapse_ok(HalfedgeHandle v0v1) //the edges v0-vr and vr-v1 must not be both boundary edges //this test makes only sense in a polymesh if the side face is a triangle + VertexHandle vr; if (!is_boundary(v1v0)) { if (v1v0_triangle) { - //VertexHandle vr = to_vertex_handle(next_halfedge_handle(v1v0)); - HalfedgeHandle h1 = next_halfedge_handle(v1v0); HalfedgeHandle h2 = next_halfedge_handle(h1); + + vr = to_vertex_handle(h1); + if (is_boundary(opposite_halfedge_handle(h1)) && is_boundary(opposite_halfedge_handle(h2))) return false; } } + // if vl and vr are equal and valid (e.g. triangle case) -> fail + if ( vl.is_valid() && (vl == vr)) return false; + // edge between two boundary vertices should be a boundary edge if ( is_boundary(v0) && is_boundary(v1) && !is_boundary(v0v1) && !is_boundary(v1v0)) return false; diff --git a/src/Unittests/unittests_trimesh_collapse.cc b/src/Unittests/unittests_trimesh_collapse.cc index fea9307a..99640d8e 100644 --- a/src/Unittests/unittests_trimesh_collapse.cc +++ b/src/Unittests/unittests_trimesh_collapse.cc @@ -741,5 +741,4 @@ TEST_F(OpenMeshCollapse, DeletedStatus) { EXPECT_FALSE(mesh_.status(mesh_.opposite_halfedge_handle(bottom_right)).deleted()) << "Halfedge from vertex 5 to vertex 3 is deleted"; } - } -- GitLab