diff --git a/include/igl/is_edge_manifold.cpp b/include/igl/is_edge_manifold.cpp index 8be00ccb5..3d3b9c0fc 100644 --- a/include/igl/is_edge_manifold.cpp +++ b/include/igl/is_edge_manifold.cpp @@ -12,36 +12,40 @@ template IGL_INLINE bool igl::is_edge_manifold(const Eigen::PlainObjectBase& /*V*/, const Eigen::PlainObjectBase& F) - { - std::vector > TTT; - for(int f=0;f v2) std::swap(v1,v2); - std::vector r(4); - r[0] = v1; r[1] = v2; - r[2] = f; r[3] = i; - TTT.push_back(r); - } - std::sort(TTT.begin(),TTT.end()); - - for(int i=2;i<(int)TTT.size();++i) +{ + // List of edges (i,j,f,c) where edge i > TTT; + for(int f=0;f& r1 = TTT[i-2]; - std::vector& r2 = TTT[i-1]; - std::vector& r3 = TTT[i]; - if ( (r1[0] == r2[0] && r2[0] == r3[0]) - && - (r1[1] == r2[1] && r2[1] == r3[1]) ) - { - return false; - } + // v1 v2 f ei + int v1 = F(f,i); + int v2 = F(f,(i+1)%3); + if (v1 > v2) std::swap(v1,v2); + std::vector r(4); + r[0] = v1; r[1] = v2; + r[2] = f; r[3] = i; + TTT.push_back(r); + } + // Sort lexicographically + std::sort(TTT.begin(),TTT.end()); + + for(int i=2;i<(int)TTT.size();++i) + { + // Check any edges occur 3 times + std::vector& r1 = TTT[i-2]; + std::vector& r2 = TTT[i-1]; + std::vector& r3 = TTT[i]; + if ( (r1[0] == r2[0] && r2[0] == r3[0]) + && + (r1[1] == r2[1] && r2[1] == r3[1]) ) + { + return false; } - return true; } + return true; +} #ifdef IGL_STATIC_LIBRARY // Explicit template specialization diff --git a/include/igl/is_edge_manifold.h b/include/igl/is_edge_manifold.h index 5498648cb..46d6cc746 100644 --- a/include/igl/is_edge_manifold.h +++ b/include/igl/is_edge_manifold.h @@ -1,6 +1,6 @@ // This file is part of libigl, a simple c++ geometry processing library. // -// Copyright (C) 2013 Alec Jacobson +// Copyright (C) 2014 Alec Jacobson // // This Source Code Form is subject to the terms of the Mozilla Public License // v. 2.0. If a copy of the MPL was not distributed with this file, You can @@ -16,13 +16,19 @@ namespace igl { // check if the mesh is edge-manifold // - // Not clear whether this returns true or false if the mesh is disc topology + // Inputs: + // V #V by dim list of mesh vertex positions **unneeded** + // F #F by 3 list of triangle indices + // Returns whether mesh is edge manifold. // // Known Bugs: // Does not check for non-manifold vertices + // + // See also: is_vertex_manifold template - IGL_INLINE bool is_edge_manifold(const Eigen::PlainObjectBase& V, - const Eigen::PlainObjectBase& F); + IGL_INLINE bool is_edge_manifold( + const Eigen::PlainObjectBase& V, + const Eigen::PlainObjectBase& F); } #ifndef IGL_STATIC_LIBRARY diff --git a/tutorial/104_Colors/main.cpp b/tutorial/104_Colors/main.cpp index f6cda9b8a..eee02d1d8 100755 --- a/tutorial/104_Colors/main.cpp +++ b/tutorial/104_Colors/main.cpp @@ -15,7 +15,7 @@ int main(int argc, char *argv[]) igl::Viewer viewer; viewer.data.set_mesh(V, F); - // Use the x coordinate as a scalar field over the surface + // Use the z coordinate as a scalar field over the surface Eigen::VectorXd Z = V.col(2); // Compute per-vertex colors diff --git a/tutorial/tutorial.html.REMOVED.git-id b/tutorial/tutorial.html.REMOVED.git-id index c45c683ee..4fb8ff6de 100644 --- a/tutorial/tutorial.html.REMOVED.git-id +++ b/tutorial/tutorial.html.REMOVED.git-id @@ -1 +1 @@ -e9a05f57f3704632186380348623deacd0199161 \ No newline at end of file +517a4351e96c89480f823c75a0e29473b348fb8d \ No newline at end of file diff --git a/tutorial/tutorial.md.REMOVED.git-id b/tutorial/tutorial.md.REMOVED.git-id index e00735e06..ae7b728fd 100644 --- a/tutorial/tutorial.md.REMOVED.git-id +++ b/tutorial/tutorial.md.REMOVED.git-id @@ -1 +1 @@ -885a107a014759a366dd66320b45dd95ee51924e \ No newline at end of file +c99c9bce7b1fc567643b1afb15f63257ec40858a \ No newline at end of file