From 789f288a2196336dd1b32959451351ebc904b06f Mon Sep 17 00:00:00 2001 From: Benjamin Ummenhofer Date: Mon, 30 Sep 2019 11:41:18 +0200 Subject: [PATCH] fixed maybe-uninitialized warning in TetraMesh.cpp also print warning on the console if the tetra is invalid --- src/Open3D/Geometry/TetraMesh.cpp | 65 ++++++++++++++++++------------- 1 file changed, 37 insertions(+), 28 deletions(-) diff --git a/src/Open3D/Geometry/TetraMesh.cpp b/src/Open3D/Geometry/TetraMesh.cpp index b7bef22b6..b96a2c2d8 100644 --- a/src/Open3D/Geometry/TetraMesh.cpp +++ b/src/Open3D/Geometry/TetraMesh.cpp @@ -254,7 +254,7 @@ std::shared_ptr TetraMesh::ExtractTriangleMesh( const auto &tetra = tetras_[tetra_i]; std::array verts; - std::array keys; + std::array keys; // keys for the edges std::array verts_indices; std::array edge_dirs; int num_verts = 0; @@ -306,7 +306,7 @@ std::shared_ptr TetraMesh::ExtractTriangleMesh( triangle_mesh->triangles_.push_back(tri); } else if (4 == num_verts) { - std::array order; + std::array order = {-1, 0, 0, 0}; if (HasCommonVertexIndex(keys[0], keys[1]) && HasCommonVertexIndex(keys[0], keys[2])) { order = {1, 0, 2, 3}; @@ -318,37 +318,46 @@ std::shared_ptr TetraMesh::ExtractTriangleMesh( order = {2, 0, 3, 1}; } - // accumulate to improve robustness of the triangle orientation test - double dot = 0; - for (int i = 0; i < 4; ++i) { - Eigen::Vector3d tri_normal = ComputeTriangleNormal( - verts[order[(4 + i - 1) % 4]], verts[order[i]], - verts[order[(i + 1) % 4]]); - dot += tri_normal.dot(edge_dirs[order[i]]); - } - if (dot < 0) std::reverse(order.begin(), order.end()); - - std::array tris; - if ((verts[order[0]] - verts[order[2]]).squaredNorm() < - (verts[order[1]] - verts[order[3]]).squaredNorm()) { - tris[0] << verts_indices[order[0]], verts_indices[order[1]], - verts_indices[order[2]]; - tris[1] << verts_indices[order[2]], verts_indices[order[3]], - verts_indices[order[0]]; + if (order[0] != -1) { + // accumulate to improve robustness of the triangle orientation + // test + double dot = 0; + for (int i = 0; i < 4; ++i) { + Eigen::Vector3d tri_normal = ComputeTriangleNormal( + verts[order[(4 + i - 1) % 4]], verts[order[i]], + verts[order[(i + 1) % 4]]); + dot += tri_normal.dot(edge_dirs[order[i]]); + } + if (dot < 0) std::reverse(order.begin(), order.end()); + + std::array tris; + if ((verts[order[0]] - verts[order[2]]).squaredNorm() < + (verts[order[1]] - verts[order[3]]).squaredNorm()) { + tris[0] << verts_indices[order[0]], verts_indices[order[1]], + verts_indices[order[2]]; + tris[1] << verts_indices[order[2]], verts_indices[order[3]], + verts_indices[order[0]]; + } else { + tris[0] << verts_indices[order[0]], verts_indices[order[1]], + verts_indices[order[3]]; + tris[1] << verts_indices[order[1]], verts_indices[order[2]], + verts_indices[order[3]]; + } + + triangle_mesh->triangles_.insert( + triangle_mesh->triangles_.end(), {tris[0], tris[1]}); } else { - tris[0] << verts_indices[order[0]], verts_indices[order[1]], - verts_indices[order[3]]; - tris[1] << verts_indices[order[1]], verts_indices[order[2]], - verts_indices[order[3]]; + utility::LogWarning( + "[ExtractTriangleMesh] failed to create triangles for " + "tetrahedron {:d}: invalid edge configuration for " + "tetrahedron\n", + int(tetra_i)); } - - triangle_mesh->triangles_.insert(triangle_mesh->triangles_.end(), - {tris[0], tris[1]}); } else if (0 != num_verts) { utility::LogWarning( "[ExtractTriangleMesh] failed to create triangles for " - "tetrahedron {:d}\n", - int(tetra_i)); + "tetrahedron {:d}: unexpected number of vertices {:d}\n", + int(tetra_i), num_verts); } }