Revision: 73915
          http://sourceforge.net/p/brlcad/code/73915
Author:   starseeker
Date:     2019-09-12 20:36:20 +0000 (Thu, 12 Sep 2019)
Log Message:
-----------
Stage logic for just yanking triangle with one bad edge.  Not 100% sure about 
this yet...

Modified Paths:
--------------
    brlcad/trunk/src/libbrep/cdt_mesh.cpp
    brlcad/trunk/src/libbrep/cdt_mesh.h

Modified: brlcad/trunk/src/libbrep/cdt_mesh.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.cpp       2019-09-12 19:46:23 UTC (rev 
73914)
+++ brlcad/trunk/src/libbrep/cdt_mesh.cpp       2019-09-12 20:36:20 UTC (rev 
73915)
@@ -1930,6 +1930,38 @@
     return false;
 }
 
+// TODO If a triangle has only one bad edge, we need to figure out if we can 
yank it...
+void
+cdt_mesh_t::remove_dangling_tris()
+{
+    if (boundary_edges_stale) {
+       boundary_edges_update();
+    }
+
+    if (!problem_edges.size()) return;
+
+    std::set<uedge_t>::iterator u_it;
+    std::set<triangle_t>::iterator t_it;
+    for (u_it = problem_edges.begin(); u_it != problem_edges.end(); u_it++) {
+       std::set<triangle_t> ptris = uedges2tris[(*u_it)];
+       for (t_it = uedges2tris[(*u_it)].begin(); t_it != 
uedges2tris[(*u_it)].end(); t_it++) {
+           triangle_t t = *t_it;
+           std::set<uedge_t> ue = t.uedges();
+           std::set<uedge_t>::iterator ue_it;
+           int bedge_cnt = 0;
+           for (ue_it = ue.begin(); ue_it != ue.end(); ue_it++) {
+               if (problem_edges.find(*ue_it) != problem_edges.end()) {
+                   bedge_cnt++;
+               }
+           }
+
+           if (bedge_cnt == 1) {
+               tris.erase(t);
+           }
+       }
+    }
+}
+
 std::vector<triangle_t>
 cdt_mesh_t::problem_edge_tris()
 {
@@ -1947,7 +1979,8 @@
     for (u_it = problem_edges.begin(); u_it != problem_edges.end(); u_it++) {
        std::set<triangle_t> ptris = uedges2tris[(*u_it)];
        for (t_it = uedges2tris[(*u_it)].begin(); t_it != 
uedges2tris[(*u_it)].end(); t_it++) {
-           uresults.insert(*t_it);
+           triangle_t t = *t_it;
+           uresults.insert(t);
        }
     }
 
@@ -2674,6 +2707,8 @@
        return false;
     }
 
+    //remove_dangling_tris();
+
     // *Wrong* triangles: problem edge and/or flipped normal triangles.  Handle
     // those first, so the subsequent clean-up pass doesn't have to worry about
     // errors they might introduce.

Modified: brlcad/trunk/src/libbrep/cdt_mesh.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.h 2019-09-12 19:46:23 UTC (rev 73914)
+++ brlcad/trunk/src/libbrep/cdt_mesh.h 2019-09-12 20:36:20 UTC (rev 73915)
@@ -173,6 +173,15 @@
        v[0] = v[1] = v[2] = -1;
     }
 
+    std::set<uedge_t> uedges()
+    {
+       std::set<uedge_t> ue;
+       ue.insert(uedge_t(v[0], v[1]));
+       ue.insert(uedge_t(v[1], v[2]));
+       ue.insert(uedge_t(v[2], v[0]));
+       return ue;
+    }
+
     bool operator<(triangle_t other) const
     {
        std::vector<long> vca, voa;
@@ -535,6 +544,7 @@
 
     // Submesh building
     std::vector<triangle_t> singularity_triangles();
+    void remove_dangling_tris();
     std::vector<triangle_t> problem_edge_tris();
     bool tri_problem_edges(triangle_t &t);
     std::vector<triangle_t> interior_incorrect_normals();

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