Loading src/AABBWrapper.cpp +30 −26 Original line number Diff line number Diff line Loading @@ -39,10 +39,14 @@ void floatTetWild::AABBWrapper::init_b_mesh(const std::vector<Vector3>& input_ve // } // } std::vector<std::pair<std::array<int, 2>, std::vector<int>>> b_edge_infos; find_boundary_edges(input_vertices, input_faces, std::vector<bool>(input_faces.size(), true), b_edge_infos); std::vector<std::pair<std::array<int, 2>, std::vector<int>>> _; std::vector<std::array<int, 2>> b_edges; find_boundary_edges(input_vertices, input_faces, std::vector<bool>(input_faces.size(), true), std::vector<bool>(input_faces.size(), true), _, b_edges); if (b_edge_infos.empty()) { if (b_edges.empty()) { // if (b_edge_infos.empty()) { b_mesh.vertices.clear(); b_mesh.vertices.create_vertices(1); b_mesh.vertices.point(0) = GEO::vec3(0, 0, 0); Loading @@ -52,29 +56,10 @@ void floatTetWild::AABBWrapper::init_b_mesh(const std::vector<Vector3>& input_ve b_mesh.facets.set_vertex(0, 1, 0); b_mesh.facets.set_vertex(0, 2, 0); } else { // b_mesh.vertices.clear(); // b_mesh.vertices.create_vertices((int) b_edges.size() * 2); // int cnt = 0; // for (auto &e:b_edges) { // for (int j = 0; j < 2; j++) { // GEO::vec3 &p = b_mesh.vertices.point(cnt++); // p[0] = input_vertices[e[j]][0]; // p[1] = input_vertices[e[j]][1]; // p[2] = input_vertices[e[j]][2]; // } // } // b_mesh.facets.clear(); // b_mesh.facets.create_triangles((int) b_edges.size()); // for (int i = 0; i < b_edges.size(); i++) { // b_mesh.facets.set_vertex(i, 0, i * 2); // b_mesh.facets.set_vertex(i, 1, i * 2); // b_mesh.facets.set_vertex(i, 2, i * 2 + 1); // } b_mesh.vertices.clear(); b_mesh.vertices.create_vertices((int) b_edge_infos.size() * 2); b_mesh.vertices.create_vertices((int) b_edges.size() * 2); int cnt = 0; for (auto &info:b_edge_infos) { auto& e = info.first; for (auto &e:b_edges) { for (int j = 0; j < 2; j++) { GEO::vec3 &p = b_mesh.vertices.point(cnt++); p[0] = input_vertices[e[j]][0]; Loading @@ -83,12 +68,31 @@ void floatTetWild::AABBWrapper::init_b_mesh(const std::vector<Vector3>& input_ve } } b_mesh.facets.clear(); b_mesh.facets.create_triangles((int) b_edge_infos.size()); for (int i = 0; i < b_edge_infos.size(); i++) { b_mesh.facets.create_triangles((int) b_edges.size()); for (int i = 0; i < b_edges.size(); i++) { b_mesh.facets.set_vertex(i, 0, i * 2); b_mesh.facets.set_vertex(i, 1, i * 2); b_mesh.facets.set_vertex(i, 2, i * 2 + 1); } // b_mesh.vertices.clear(); // b_mesh.vertices.create_vertices((int) b_edge_infos.size() * 2); // int cnt = 0; // for (auto &info:b_edge_infos) { // auto& e = info.first; // for (int j = 0; j < 2; j++) { // GEO::vec3 &p = b_mesh.vertices.point(cnt++); // p[0] = input_vertices[e[j]][0]; // p[1] = input_vertices[e[j]][1]; // p[2] = input_vertices[e[j]][2]; // } // } // b_mesh.facets.clear(); // b_mesh.facets.create_triangles((int) b_edge_infos.size()); // for (int i = 0; i < b_edge_infos.size(); i++) { // b_mesh.facets.set_vertex(i, 0, i * 2); // b_mesh.facets.set_vertex(i, 1, i * 2); // b_mesh.facets.set_vertex(i, 2, i * 2 + 1); // } } mesh_reorder(b_mesh, GEO::MESH_ORDER_MORTON); Loading src/TriangleInsertion.cpp +24 −10 Original line number Diff line number Diff line Loading @@ -200,6 +200,7 @@ void floatTetWild::insert_triangles_aux(const std::vector<Vector3> &input_vertic const std::vector<Vector3i> &input_faces, const std::vector<int> &input_tags, Mesh &mesh, std::vector<bool> &is_face_inserted, AABBWrapper &tree, bool is_again) { std::vector<bool> old_is_face_inserted = is_face_inserted;///is_face_inserted has been intialized in main logger().info("triangle insertion start, #f = {}, #v = {}, #t = {}", input_faces.size(), mesh.tet_vertices.size(), mesh.tets.size()); Loading Loading @@ -301,13 +302,13 @@ void floatTetWild::insert_triangles_aux(const std::vector<Vector3> &input_vertic ///// std::vector<std::array<int, 2>> b_edges1; std::vector<std::pair<std::array<int, 2>, std::vector<int>>> b_edge_infos; find_boundary_edges(input_vertices, input_faces, is_face_inserted, b_edge_infos); find_boundary_edges(input_vertices, input_faces, is_face_inserted, old_is_face_inserted, b_edge_infos, b_edges1); logger().info("find_boundary_edges done"); std::vector<std::array<int, 2>> b_edges1; std::vector<std::array<int, 3>> known_surface_fs; std::vector<std::array<int, 3>> known_not_surface_fs; insert_boundary_edges(input_vertices, input_faces, b_edge_infos, track_surface_fs, mesh, tree, b_edges1, insert_boundary_edges(input_vertices, input_faces, b_edge_infos, track_surface_fs, mesh, tree, is_face_inserted, is_again, known_surface_fs, known_not_surface_fs); logger().info("uninserted #f = {}/{}", std::count(is_face_inserted.begin(), is_face_inserted.end(), false), is_face_inserted.size() - cnt_matched); Loading Loading @@ -1473,8 +1474,9 @@ void floatTetWild::pair_track_surface_fs(Mesh &mesh, std::vector<std::array<std: } void floatTetWild::find_boundary_edges(const std::vector<Vector3> &input_vertices, const std::vector<Vector3i> &input_faces, const std::vector<bool> &is_face_inserted, std::vector<std::pair<std::array<int, 2>, std::vector<int>>>& b_edge_infos) { const std::vector<bool> &is_face_inserted, const std::vector<bool>& old_is_face_inserted, std::vector<std::pair<std::array<int, 2>, std::vector<int>>> &b_edge_infos, std::vector<std::array<int, 2>>& b_edges) { std::vector<std::array<int, 2>> edges; std::vector<std::vector<int>> conn_tris(input_vertices.size()); for (int i = 0; i < input_faces.size(); i++) { Loading @@ -1499,8 +1501,17 @@ void floatTetWild::find_boundary_edges(const std::vector<Vector3> &input_vertice std::vector<int> n12_f_ids; std::set_intersection(conn_tris[e[0]].begin(), conn_tris[e[0]].end(), conn_tris[e[1]].begin(), conn_tris[e[1]].end(), std::back_inserter(n12_f_ids)); bool needs_preserve = false; for(int f_id: n12_f_ids){ if(!old_is_face_inserted[f_id]) { needs_preserve = true; break; } } if (n12_f_ids.size() == 1) {//open boundary b_edges.push_back(e); if(needs_preserve) b_edge_infos.push_back(std::make_pair(e, n12_f_ids)); cnt1++; } else { Loading Loading @@ -1560,6 +1571,8 @@ void floatTetWild::find_boundary_edges(const std::vector<Vector3> &input_vertice continue; cnt2++; b_edges.push_back(e); if(needs_preserve) b_edge_infos.push_back(std::make_pair(e, n12_f_ids)); } } Loading @@ -1575,7 +1588,7 @@ double time_e4 = 0; bool floatTetWild::insert_boundary_edges(const std::vector<Vector3> &input_vertices, const std::vector<Vector3i> &input_faces, std::vector<std::pair<std::array<int, 2>, std::vector<int>>>& b_edge_infos, std::vector<std::array<std::vector<int>, 4>> &track_surface_fs, Mesh& mesh, AABBWrapper &tree, std::vector<std::array<int, 2>>& b_edges, AABBWrapper &tree, std::vector<bool> &is_face_inserted, bool is_again, std::vector<std::array<int, 3>>& known_surface_fs, std::vector<std::array<int, 3>>& known_not_surface_fs) { Loading Loading @@ -1642,7 +1655,7 @@ bool floatTetWild::insert_boundary_edges(const std::vector<Vector3> &input_verti mesh.tet_vertices[v_id].is_on_boundary = true; } b_edges.push_back(e); // b_edges.push_back(e); // //fortest // for (int v_id: snapped_v_ids) { Loading Loading @@ -1683,6 +1696,7 @@ bool floatTetWild::insert_boundary_edges(const std::vector<Vector3> &input_verti mesh.tet_vertices[e[0]].is_on_boundary = true; mesh.tet_vertices[e[1]].is_on_boundary = true; } // b_edges.push_back(e); timer.start(); ///double check neighbors Loading Loading @@ -1818,7 +1832,7 @@ bool floatTetWild::insert_boundary_edges(const std::vector<Vector3> &input_verti //// fout_v.close(); // //fortest cout << "b_edges.size = " << b_edges.size() << endl; // cout << "b_edges.size = " << b_edges.size() << endl; return is_all_inserted; } Loading src/TriangleInsertion.h +4 −3 Original line number Diff line number Diff line Loading @@ -57,13 +57,14 @@ namespace floatTetWild { ///edge void find_boundary_edges(const std::vector<Vector3> &input_vertices, const std::vector<Vector3i> &input_faces, const std::vector<bool> &is_face_inserted, std::vector<std::pair<std::array<int, 2>, std::vector<int>>> &b_edge_infos); const std::vector<bool> &is_face_inserted, const std::vector<bool>& old_is_face_inserted, std::vector<std::pair<std::array<int, 2>, std::vector<int>>> &b_edge_infos, std::vector<std::array<int, 2>>& b_edges); bool insert_boundary_edges(const std::vector<Vector3> &input_vertices, const std::vector<Vector3i> &input_faces, std::vector<std::pair<std::array<int, 2>, std::vector<int>>> &b_edge_infos, std::vector<std::array<std::vector<int>, 4>> &track_surface_fs, Mesh &mesh, AABBWrapper &tree, std::vector<std::array<int, 2>>& b_edges, AABBWrapper &tree, std::vector<bool> &is_face_inserted, bool is_again, std::vector<std::array<int, 3>>& known_surface_fs, std::vector<std::array<int, 3>>& known_not_surface_fs); Loading Loading
src/AABBWrapper.cpp +30 −26 Original line number Diff line number Diff line Loading @@ -39,10 +39,14 @@ void floatTetWild::AABBWrapper::init_b_mesh(const std::vector<Vector3>& input_ve // } // } std::vector<std::pair<std::array<int, 2>, std::vector<int>>> b_edge_infos; find_boundary_edges(input_vertices, input_faces, std::vector<bool>(input_faces.size(), true), b_edge_infos); std::vector<std::pair<std::array<int, 2>, std::vector<int>>> _; std::vector<std::array<int, 2>> b_edges; find_boundary_edges(input_vertices, input_faces, std::vector<bool>(input_faces.size(), true), std::vector<bool>(input_faces.size(), true), _, b_edges); if (b_edge_infos.empty()) { if (b_edges.empty()) { // if (b_edge_infos.empty()) { b_mesh.vertices.clear(); b_mesh.vertices.create_vertices(1); b_mesh.vertices.point(0) = GEO::vec3(0, 0, 0); Loading @@ -52,29 +56,10 @@ void floatTetWild::AABBWrapper::init_b_mesh(const std::vector<Vector3>& input_ve b_mesh.facets.set_vertex(0, 1, 0); b_mesh.facets.set_vertex(0, 2, 0); } else { // b_mesh.vertices.clear(); // b_mesh.vertices.create_vertices((int) b_edges.size() * 2); // int cnt = 0; // for (auto &e:b_edges) { // for (int j = 0; j < 2; j++) { // GEO::vec3 &p = b_mesh.vertices.point(cnt++); // p[0] = input_vertices[e[j]][0]; // p[1] = input_vertices[e[j]][1]; // p[2] = input_vertices[e[j]][2]; // } // } // b_mesh.facets.clear(); // b_mesh.facets.create_triangles((int) b_edges.size()); // for (int i = 0; i < b_edges.size(); i++) { // b_mesh.facets.set_vertex(i, 0, i * 2); // b_mesh.facets.set_vertex(i, 1, i * 2); // b_mesh.facets.set_vertex(i, 2, i * 2 + 1); // } b_mesh.vertices.clear(); b_mesh.vertices.create_vertices((int) b_edge_infos.size() * 2); b_mesh.vertices.create_vertices((int) b_edges.size() * 2); int cnt = 0; for (auto &info:b_edge_infos) { auto& e = info.first; for (auto &e:b_edges) { for (int j = 0; j < 2; j++) { GEO::vec3 &p = b_mesh.vertices.point(cnt++); p[0] = input_vertices[e[j]][0]; Loading @@ -83,12 +68,31 @@ void floatTetWild::AABBWrapper::init_b_mesh(const std::vector<Vector3>& input_ve } } b_mesh.facets.clear(); b_mesh.facets.create_triangles((int) b_edge_infos.size()); for (int i = 0; i < b_edge_infos.size(); i++) { b_mesh.facets.create_triangles((int) b_edges.size()); for (int i = 0; i < b_edges.size(); i++) { b_mesh.facets.set_vertex(i, 0, i * 2); b_mesh.facets.set_vertex(i, 1, i * 2); b_mesh.facets.set_vertex(i, 2, i * 2 + 1); } // b_mesh.vertices.clear(); // b_mesh.vertices.create_vertices((int) b_edge_infos.size() * 2); // int cnt = 0; // for (auto &info:b_edge_infos) { // auto& e = info.first; // for (int j = 0; j < 2; j++) { // GEO::vec3 &p = b_mesh.vertices.point(cnt++); // p[0] = input_vertices[e[j]][0]; // p[1] = input_vertices[e[j]][1]; // p[2] = input_vertices[e[j]][2]; // } // } // b_mesh.facets.clear(); // b_mesh.facets.create_triangles((int) b_edge_infos.size()); // for (int i = 0; i < b_edge_infos.size(); i++) { // b_mesh.facets.set_vertex(i, 0, i * 2); // b_mesh.facets.set_vertex(i, 1, i * 2); // b_mesh.facets.set_vertex(i, 2, i * 2 + 1); // } } mesh_reorder(b_mesh, GEO::MESH_ORDER_MORTON); Loading
src/TriangleInsertion.cpp +24 −10 Original line number Diff line number Diff line Loading @@ -200,6 +200,7 @@ void floatTetWild::insert_triangles_aux(const std::vector<Vector3> &input_vertic const std::vector<Vector3i> &input_faces, const std::vector<int> &input_tags, Mesh &mesh, std::vector<bool> &is_face_inserted, AABBWrapper &tree, bool is_again) { std::vector<bool> old_is_face_inserted = is_face_inserted;///is_face_inserted has been intialized in main logger().info("triangle insertion start, #f = {}, #v = {}, #t = {}", input_faces.size(), mesh.tet_vertices.size(), mesh.tets.size()); Loading Loading @@ -301,13 +302,13 @@ void floatTetWild::insert_triangles_aux(const std::vector<Vector3> &input_vertic ///// std::vector<std::array<int, 2>> b_edges1; std::vector<std::pair<std::array<int, 2>, std::vector<int>>> b_edge_infos; find_boundary_edges(input_vertices, input_faces, is_face_inserted, b_edge_infos); find_boundary_edges(input_vertices, input_faces, is_face_inserted, old_is_face_inserted, b_edge_infos, b_edges1); logger().info("find_boundary_edges done"); std::vector<std::array<int, 2>> b_edges1; std::vector<std::array<int, 3>> known_surface_fs; std::vector<std::array<int, 3>> known_not_surface_fs; insert_boundary_edges(input_vertices, input_faces, b_edge_infos, track_surface_fs, mesh, tree, b_edges1, insert_boundary_edges(input_vertices, input_faces, b_edge_infos, track_surface_fs, mesh, tree, is_face_inserted, is_again, known_surface_fs, known_not_surface_fs); logger().info("uninserted #f = {}/{}", std::count(is_face_inserted.begin(), is_face_inserted.end(), false), is_face_inserted.size() - cnt_matched); Loading Loading @@ -1473,8 +1474,9 @@ void floatTetWild::pair_track_surface_fs(Mesh &mesh, std::vector<std::array<std: } void floatTetWild::find_boundary_edges(const std::vector<Vector3> &input_vertices, const std::vector<Vector3i> &input_faces, const std::vector<bool> &is_face_inserted, std::vector<std::pair<std::array<int, 2>, std::vector<int>>>& b_edge_infos) { const std::vector<bool> &is_face_inserted, const std::vector<bool>& old_is_face_inserted, std::vector<std::pair<std::array<int, 2>, std::vector<int>>> &b_edge_infos, std::vector<std::array<int, 2>>& b_edges) { std::vector<std::array<int, 2>> edges; std::vector<std::vector<int>> conn_tris(input_vertices.size()); for (int i = 0; i < input_faces.size(); i++) { Loading @@ -1499,8 +1501,17 @@ void floatTetWild::find_boundary_edges(const std::vector<Vector3> &input_vertice std::vector<int> n12_f_ids; std::set_intersection(conn_tris[e[0]].begin(), conn_tris[e[0]].end(), conn_tris[e[1]].begin(), conn_tris[e[1]].end(), std::back_inserter(n12_f_ids)); bool needs_preserve = false; for(int f_id: n12_f_ids){ if(!old_is_face_inserted[f_id]) { needs_preserve = true; break; } } if (n12_f_ids.size() == 1) {//open boundary b_edges.push_back(e); if(needs_preserve) b_edge_infos.push_back(std::make_pair(e, n12_f_ids)); cnt1++; } else { Loading Loading @@ -1560,6 +1571,8 @@ void floatTetWild::find_boundary_edges(const std::vector<Vector3> &input_vertice continue; cnt2++; b_edges.push_back(e); if(needs_preserve) b_edge_infos.push_back(std::make_pair(e, n12_f_ids)); } } Loading @@ -1575,7 +1588,7 @@ double time_e4 = 0; bool floatTetWild::insert_boundary_edges(const std::vector<Vector3> &input_vertices, const std::vector<Vector3i> &input_faces, std::vector<std::pair<std::array<int, 2>, std::vector<int>>>& b_edge_infos, std::vector<std::array<std::vector<int>, 4>> &track_surface_fs, Mesh& mesh, AABBWrapper &tree, std::vector<std::array<int, 2>>& b_edges, AABBWrapper &tree, std::vector<bool> &is_face_inserted, bool is_again, std::vector<std::array<int, 3>>& known_surface_fs, std::vector<std::array<int, 3>>& known_not_surface_fs) { Loading Loading @@ -1642,7 +1655,7 @@ bool floatTetWild::insert_boundary_edges(const std::vector<Vector3> &input_verti mesh.tet_vertices[v_id].is_on_boundary = true; } b_edges.push_back(e); // b_edges.push_back(e); // //fortest // for (int v_id: snapped_v_ids) { Loading Loading @@ -1683,6 +1696,7 @@ bool floatTetWild::insert_boundary_edges(const std::vector<Vector3> &input_verti mesh.tet_vertices[e[0]].is_on_boundary = true; mesh.tet_vertices[e[1]].is_on_boundary = true; } // b_edges.push_back(e); timer.start(); ///double check neighbors Loading Loading @@ -1818,7 +1832,7 @@ bool floatTetWild::insert_boundary_edges(const std::vector<Vector3> &input_verti //// fout_v.close(); // //fortest cout << "b_edges.size = " << b_edges.size() << endl; // cout << "b_edges.size = " << b_edges.size() << endl; return is_all_inserted; } Loading
src/TriangleInsertion.h +4 −3 Original line number Diff line number Diff line Loading @@ -57,13 +57,14 @@ namespace floatTetWild { ///edge void find_boundary_edges(const std::vector<Vector3> &input_vertices, const std::vector<Vector3i> &input_faces, const std::vector<bool> &is_face_inserted, std::vector<std::pair<std::array<int, 2>, std::vector<int>>> &b_edge_infos); const std::vector<bool> &is_face_inserted, const std::vector<bool>& old_is_face_inserted, std::vector<std::pair<std::array<int, 2>, std::vector<int>>> &b_edge_infos, std::vector<std::array<int, 2>>& b_edges); bool insert_boundary_edges(const std::vector<Vector3> &input_vertices, const std::vector<Vector3i> &input_faces, std::vector<std::pair<std::array<int, 2>, std::vector<int>>> &b_edge_infos, std::vector<std::array<std::vector<int>, 4>> &track_surface_fs, Mesh &mesh, AABBWrapper &tree, std::vector<std::array<int, 2>>& b_edges, AABBWrapper &tree, std::vector<bool> &is_face_inserted, bool is_again, std::vector<std::array<int, 3>>& known_surface_fs, std::vector<std::array<int, 3>>& known_not_surface_fs); Loading