Revision: 74206
          http://sourceforge.net/p/brlcad/code/74206
Author:   starseeker
Date:     2019-10-21 19:36:20 +0000 (Mon, 21 Oct 2019)
Log Message:
-----------
add a plotting method so we can immediately see which triangles are overlapping

Modified Paths:
--------------
    brlcad/trunk/src/libbrep/cdt_ovlps.cpp

Modified: brlcad/trunk/src/libbrep/cdt_ovlps.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-10-21 19:06:04 UTC (rev 
74205)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-10-21 19:36:20 UTC (rev 
74206)
@@ -288,7 +288,7 @@
        std::map<cdt_mesh::uedge_t, long> interior_uedge_ids;
        std::map<long, cdt_mesh::uedge_t> interior_uedges;
        RTree<long, double, 3> iedge_tree;
-       
+
        // When we consider a vertex near an edge (i.e. we're going to yank 
that edge
        // and retessellate) all the other unassigned overts that have that 
edge as
        // their assigned closest edge need to find a new one.  Make it easy to 
find
@@ -315,8 +315,12 @@
 
        void retessellate(std::set<size_t> &ov);
 
+       std::set<long> ovlping_tris;
        cdt_mesh::cdt_mesh_t *fmesh;
 
+       void plot(const char *fname);
+       void plot();
+
        void verts_one_ring_update(long p_id);
     private:
        void init_verts();
@@ -496,6 +500,49 @@
     fclose(plot);
 }
 
+void
+omesh_t::plot(const char *fname)
+{
+    struct bu_color c = BU_COLOR_INIT_ZERO;
+    unsigned char rgb[3] = {0,0,255};
+    FILE *plot = fopen(fname, "w");
+
+    RTree<size_t, double, 3>::Iterator tree_it;
+    size_t t_ind;
+    cdt_mesh::triangle_t tri;
+
+    bu_color_from_rgb_chars(&c, (const unsigned char *)rgb);
+
+    fmesh->tris_tree.GetFirst(tree_it);
+    while (!tree_it.IsNull()) {
+       t_ind = *tree_it;
+       tri = fmesh->tris_vect[t_ind];
+       fmesh->plot_tri(tri, &c, plot, 255, 0, 0);
+       ++tree_it;
+    }
+
+    bu_color_rand(&c, BU_COLOR_RANDOM_LIGHTENED);
+    pl_color_buc(plot, &c);
+    std::set<long>::iterator ts_it;
+    for (ts_it = ovlping_tris.begin(); ts_it != ovlping_tris.end(); ts_it++) {
+       tri = fmesh->tris_vect[*ts_it];
+       fmesh->plot_tri(tri, &c, plot, 255, 0, 0);
+    }
+
+    fclose(plot);
+}
+
+void
+omesh_t::plot()
+{
+    struct bu_vls fname = BU_VLS_INIT_ZERO;
+    struct ON_Brep_CDT_State *s_cdt = (struct ON_Brep_CDT_State *)fmesh->p_cdt;
+    bu_vls_sprintf(&fname, "%s-%d_ovlps.plot3", s_cdt->name, fmesh->f_id);
+    plot(bu_vls_cstr(&fname));
+    bu_vls_free(&fname);
+}
+
+
 static bool NearVertCallback(long data, void *a_context) {
     std::set<long> *nverts = (std::set<long> *)a_context;
     nverts->insert(data);
@@ -1023,6 +1070,7 @@
     return true;
 }
 
+#if 0
 static bool NearFacesCallback(size_t data, void *a_context) {
     std::set<size_t> *faces = (std::set<size_t> *)a_context;
     size_t f_id = data;
@@ -1029,6 +1077,7 @@
     faces->insert(f_id);
     return true;
 }
+#endif
 
 std::set<std::pair<cdt_mesh::cdt_mesh_t *, cdt_mesh::cdt_mesh_t *>>
 possibly_interfering_face_pairs(struct ON_Brep_CDT_State **s_a, int s_cnt)
@@ -1065,12 +1114,9 @@
 }
 
 size_t
-face_ovlps_cnt(struct ON_Brep_CDT_State **s_a, int s_cnt)
+face_fmesh_ovlps(std::set<std::pair<cdt_mesh::cdt_mesh_t *, 
cdt_mesh::cdt_mesh_t *>> check_pairs)
 {
     size_t tri_isects = 0;
-    std::set<std::pair<cdt_mesh::cdt_mesh_t *, cdt_mesh::cdt_mesh_t *>> 
check_pairs;
-    check_pairs = possibly_interfering_face_pairs(s_a, s_cnt);
-
     std::set<std::pair<cdt_mesh::cdt_mesh_t *, cdt_mesh::cdt_mesh_t 
*>>::iterator cp_it;
     for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
        cdt_mesh::cdt_mesh_t *fmesh1 = cp_it->first;
@@ -1098,6 +1144,49 @@
     return tri_isects;
 }
 
+size_t
+face_omesh_ovlps(std::set<std::pair<omesh_t *, omesh_t *>> check_pairs)
+{
+    size_t tri_isects = 0;
+    std::set<std::pair<omesh_t *, omesh_t *>>::iterator cp_it;
+    for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
+       cp_it->first->ovlping_tris.clear();
+       cp_it->second->ovlping_tris.clear();
+    }
+    for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
+       cdt_mesh::cdt_mesh_t *fmesh1 = cp_it->first->fmesh;
+       cdt_mesh::cdt_mesh_t *fmesh2 = cp_it->second->fmesh;
+       struct ON_Brep_CDT_State *s_cdt1 = (struct ON_Brep_CDT_State 
*)fmesh1->p_cdt;
+       struct ON_Brep_CDT_State *s_cdt2 = (struct ON_Brep_CDT_State 
*)fmesh2->p_cdt;
+       if (s_cdt1 != s_cdt2) {
+           std::set<std::pair<size_t, size_t>> tris_prelim;
+           size_t ovlp_cnt = fmesh1->tris_tree.Overlaps(fmesh2->tris_tree, 
&tris_prelim);
+           if (ovlp_cnt) {
+               std::set<std::pair<size_t, size_t>>::iterator tb_it;
+               for (tb_it = tris_prelim.begin(); tb_it != tris_prelim.end(); 
tb_it++) {
+                   cdt_mesh::triangle_t t1 = fmesh1->tris_vect[tb_it->first];
+                   cdt_mesh::triangle_t t2 = fmesh2->tris_vect[tb_it->second];
+                   point_t isectpt1 = {MAX_FASTF, MAX_FASTF, MAX_FASTF};
+                   point_t isectpt2 = {MAX_FASTF, MAX_FASTF, MAX_FASTF};
+                   int isect = tri_isect(fmesh1, t1, fmesh2, t2, &isectpt1, 
&isectpt2);
+                   if (isect) {
+                       cp_it->first->ovlping_tris.insert(t1.ind);
+                       cp_it->second->ovlping_tris.insert(t2.ind);
+                       tri_isects++;
+                   }
+               }
+           }
+       }
+    }
+    for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
+       cp_it->first->plot();
+       cp_it->second->plot();
+    }
+ 
+    return tri_isects;
+}
+
+
 double
 tri_shortest_edge(cdt_mesh::cdt_mesh_t *fmesh, long t_ind)
 {
@@ -1937,7 +2026,7 @@
 }
 
 void
-check_faces_validity(std::set<std::pair<cdt_mesh::cdt_mesh_t *, 
cdt_mesh::cdt_mesh_t *>> &check_pairs, int id)
+check_faces_validity(std::set<std::pair<cdt_mesh::cdt_mesh_t *, 
cdt_mesh::cdt_mesh_t *>> &check_pairs, int UNUSED(id))
 {
     std::set<cdt_mesh::cdt_mesh_t *> fmeshes;
     std::set<std::pair<cdt_mesh::cdt_mesh_t *, cdt_mesh::cdt_mesh_t 
*>>::iterator cp_it;
@@ -1951,9 +2040,11 @@
     for (f_it = fmeshes.begin(); f_it != fmeshes.end(); f_it++) {
        cdt_mesh::cdt_mesh_t *fmesh = *f_it;
        std::cout << "face " << fmesh->f_id << " validity: " << fmesh->valid(1) 
<< "\n";
+#if 0
        struct ON_Brep_CDT_State *s_cdt = (struct ON_Brep_CDT_State 
*)fmesh->p_cdt;
        std::string fpname = std::to_string(id) + std::string("_") + 
std::string(s_cdt->name) + std::string("_face_") + std::to_string(fmesh->f_id) 
+ std::string(".plot3");
        fmesh->tris_plot(fpname.c_str());
+#endif
     }
 }
 
@@ -2419,10 +2510,11 @@
     check_pairs = possibly_interfering_face_pairs(s_a, s_cnt);
 
     //std::cout << "Found " << check_pairs.size() << " potentially interfering 
face pairs\n";
+    if (!check_pairs.size()) return 0;
 
     check_faces_validity(check_pairs, 0);
 
-    int face_ov_cnt = face_ovlps_cnt(s_a, s_cnt);
+    int face_ov_cnt = face_fmesh_ovlps(check_pairs);
     std::cout << "Initial overlap cnt: " << face_ov_cnt << "\n";
     if (!face_ov_cnt) return 0;
 
@@ -2446,6 +2538,7 @@
        omesh_t *o2 = f2omap[p_it->second];
        ocheck_pairs.insert(std::make_pair(o1, o2));
     }
+    face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
 
     size_t avcnt = adjust_close_verts(ocheck_pairs);
 
@@ -2454,7 +2547,8 @@
        check_faces_validity(check_pairs, 1);
     }
 
-    std::cout << "Post vert adjustment overlap cnt: " << face_ovlps_cnt(s_a, 
s_cnt) << "\n";
+    face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
+    std::cout << "Post vert adjustment overlap cnt: " << face_ov_cnt << "\n";
 
 
     // Boundary edges are handled at a brep object level, not a face level - 
handle
@@ -2468,7 +2562,8 @@
     if (sbfvtri_cnt) {
        std::cout << "Replaced " << sbfvtri_cnt << " triangles by splitting 
edges near vertices\n";
        check_faces_validity(check_pairs, 2);
-       std::cout << "Post edges-near-verts split overlap cnt: " << 
face_ovlps_cnt(s_a, s_cnt) << "\n";
+       face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
+       std::cout << "Post edges-near-verts split overlap cnt: " << face_ov_cnt 
<< "\n";
     }
 
 #if 0
@@ -2484,11 +2579,12 @@
 
     process_near_edge_pnts(face_npnts);
 
-    std::cout << "Post interior-near-edge split overlap cnt: " << 
face_ovlps_cnt(s_a, s_cnt) << "\n";
+    face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
+    std::cout << "Post interior-near-edge split overlap cnt: " << face_ov_cnt 
<< "\n";
 
+#if 0
 
 
-
     int tneigh_cnt = 0;
 
     std::map<cdt_mesh::cdt_mesh_t *, std::set<struct p_mvert_info 
*>>::iterator f_it;
@@ -2584,8 +2680,10 @@
        }
 
     }
+#endif
 
-    std::cout << "Post tri split overlap cnt: " << face_ovlps_cnt(s_a, s_cnt) 
<< "\n";
+    face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
+    std::cout << "Post tri split overlap cnt: " << face_ov_cnt << "\n";
     check_faces_validity(check_pairs, 4);
 
     return 0;

This was sent by the SourceForge.net collaborative development platform, the 
world's largest Open Source development site.



_______________________________________________
BRL-CAD Source Commits mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/brlcad-commits

Reply via email to