Commit ce28a02b authored by YIxin-Hu's avatar YIxin-Hu
Browse files

opt insert_boundary_edges

parent e2a47740
Loading
Loading
Loading
Loading
+30 −26
Original line number Diff line number Diff line
@@ -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);
@@ -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];
@@ -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);
+24 −10
Original line number Diff line number Diff line
@@ -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());
@@ -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);
@@ -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++) {
@@ -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 {
@@ -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));
        }
    }
@@ -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) {
@@ -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) {
@@ -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
@@ -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;
}
+4 −3
Original line number Diff line number Diff line
@@ -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);