Revision: 74321
          http://sourceforge.net/p/brlcad/code/74321
Author:   starseeker
Date:     2019-11-09 21:49:10 +0000 (Sat, 09 Nov 2019)
Log Message:
-----------
Experiment with using the triangle intersection step itself to detect when we 
need to split a brep edge.

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-11-09 19:41:36 UTC (rev 
74320)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-11-09 21:49:10 UTC (rev 
74321)
@@ -282,7 +282,7 @@
        std::cout << "Bad vert box!\n";
     }
     vtree.Insert(fMin, fMax, v->p_id);
-    rebuild_vtree();
+    //rebuild_vtree();
 }
 
 void
@@ -998,7 +998,11 @@
  * intersection.
  *****************************************************************************/
 static int
-tri_isect(omesh_t *omesh1, cdt_mesh::triangle_t &t1, omesh_t *omesh2, 
cdt_mesh::triangle_t &t2)
+tri_isect(
+       omesh_t *omesh1, cdt_mesh::triangle_t &t1,
+               omesh_t *omesh2, cdt_mesh::triangle_t &t2,
+       std::map<overt_t *, std::map<cdt_mesh::bedge_seg_t *, int>> 
*vert_edge_cnts
+       )
 {
     cdt_mesh::cdt_mesh_t *fmesh1 = omesh1->fmesh; 
     cdt_mesh::cdt_mesh_t *fmesh2 = omesh2->fmesh; 
@@ -1087,6 +1091,11 @@
 
     // If we're not in an edge intersect situation, all three vertices go into 
the
     // refinement pot.
+   
+    // For each point in each triangle, check if the closest edge in the
+    // opposite triangle is a brep face edge.  If so, it's a candidate to drive
+    // edge splitting 
+  
     for (int i = 0; i < 3; i++) {
        overt_t *v = omesh1->overts[t1.v[i]];
        if (!v) {
@@ -1093,6 +1102,18 @@
            std::cout << "WARNING: - no overt for vertex??\n";
            continue;
        }
+       if (vert_edge_cnts) {
+           ON_3dPoint p = v->vpnt();
+           cdt_mesh::uedge_t closest_edge = fmesh2->closest_uedge(t2, p);
+           if (fmesh2->brep_edges.find(closest_edge) != 
fmesh2->brep_edges.end()) {
+               cdt_mesh::bedge_seg_t *bseg = fmesh2->ue2b_map[closest_edge];
+               if (!bseg) {
+                   std::cout << "couldn't find bseg pointer??\n";
+               } else {
+                   (*vert_edge_cnts)[v][bseg]++;
+               }       
+           }
+       }
        omesh2->refinement_overts[v].insert(t1.ind);
        omesh1->intruding_overts[v].insert(t1.ind);
        omesh1->intruding_tris.insert(t1.ind);
@@ -1103,6 +1124,18 @@
            std::cout << "WARNING: - no overt for vertex??\n";
            continue;
        }
+       if (vert_edge_cnts) {
+           ON_3dPoint p = v->vpnt();
+           cdt_mesh::uedge_t closest_edge = fmesh1->closest_uedge(t2, p);
+           if (fmesh1->brep_edges.find(closest_edge) != 
fmesh1->brep_edges.end()) {
+               cdt_mesh::bedge_seg_t *bseg = fmesh1->ue2b_map[closest_edge];
+               if (!bseg) {
+                   std::cout << "couldn't find bseg pointer??\n";
+               } else {
+                   (*vert_edge_cnts)[v][bseg]++;
+               }       
+           }
+       }
        omesh1->refinement_overts[v].insert(t2.ind);
        omesh2->intruding_overts[v].insert(t2.ind);
        omesh2->intruding_tris.insert(t2.ind);
@@ -1179,11 +1212,15 @@
 face_omesh_ovlps(std::set<std::pair<omesh_t *, omesh_t *>> check_pairs)
 {
     size_t tri_isects = 0;
+    std::set<omesh_t *> a_omesh;
     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->refinement_clear();
        cp_it->second->refinement_clear();
+       a_omesh.insert(cp_it->first);
+       a_omesh.insert(cp_it->second);
     }
+    std::map<overt_t *, std::map<cdt_mesh::bedge_seg_t *, int>> vert_edge_cnts;
     for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
        omesh_t *omesh1 = cp_it->first;
        omesh_t *omesh2 = cp_it->second;
@@ -1197,7 +1234,7 @@
                for (tb_it = tris_prelim.begin(); tb_it != tris_prelim.end(); 
tb_it++) {
                    cdt_mesh::triangle_t t1 = 
omesh1->fmesh->tris_vect[tb_it->first];
                    cdt_mesh::triangle_t t2 = 
omesh2->fmesh->tris_vect[tb_it->second];
-                   int isect = tri_isect(omesh1, t1, omesh2, t2);
+                   int isect = tri_isect(omesh1, t1, omesh2, t2, 
&vert_edge_cnts);
                    if (isect) {
                        tri_isects++;
                    }
@@ -1205,6 +1242,45 @@
            }
        }
     }
+
+    // Process the close-to-edge cases
+    std::set<overt_t *> everts;
+    std::map<cdt_mesh::bedge_seg_t *, std::set<overt_t *>> edge_verts;
+    std::map<overt_t *, std::map<cdt_mesh::bedge_seg_t *, int>>::iterator 
ov_it;
+    for (ov_it = vert_edge_cnts.begin(); ov_it != vert_edge_cnts.end(); 
ov_it++) {
+       std::map<cdt_mesh::bedge_seg_t *, int>::iterator s_it;
+       int cnt = 0;
+       for (s_it = ov_it->second.begin(); s_it != ov_it->second.end(); s_it++) 
{
+           if (s_it->second > 1) {
+               edge_verts[s_it->first].insert(ov_it->first);
+               everts.insert(ov_it->first);
+               cnt++;
+           }
+       }
+    }
+    std::map<cdt_mesh::bedge_seg_t *, std::set<overt_t *>>::iterator e_it;
+    for (e_it = edge_verts.begin(); e_it != edge_verts.end(); e_it++) {
+       std::cout << "found " << e_it->second.size() << " edge splits\n";
+    }
+    std::set<omesh_t *>::iterator a_it;
+    for (a_it = a_omesh.begin(); a_it != a_omesh.end(); a_it++) {
+       std::set<overt_t *>::iterator v_it;
+       omesh_t *om = *a_it;
+       for (v_it = everts.begin(); v_it != everts.end(); v_it++) {
+           overt_t *v = *v_it;
+           if (om->refinement_overts.find(v) != om->refinement_overts.end()) {
+               std::cout << "erasing edge split from regular refinement\n";
+               om->refinement_overts.erase(v);
+           }
+       }
+    }
+    for (a_it = a_omesh.begin(); a_it != a_omesh.end(); a_it++) {
+       omesh_t *om = *a_it;
+       if (om->refinement_overts.size()) {
+           std::cout << "mesh has " << om->refinement_overts.size() << " 
interior refinement pnts\n";
+       }
+    }
+
     for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
        cp_it->first->plot();
        cp_it->second->plot();
@@ -2335,9 +2411,9 @@
                        edge_vert[eseg] = v;
                        used_verts++;
                    }
-                   pl_color(plot_file, 255, 0, 0);
+                   pl_color(plot_file, 100, 0, 0);
                    BBOX_PLOT(plot_file, v->bb);
-                   pl_color(plot_file, 0, 0, 255);
+                   pl_color(plot_file, 0, 0, 100);
                    ON_BoundingBox edge_bb = edge_bbox(eseg);
                    BBOX_PLOT(plot_file, edge_bb);
                } else {
@@ -2479,7 +2555,7 @@
        for (tb_it = tris_prelim.begin(); tb_it != tris_prelim.end(); tb_it++) {
            cdt_mesh::triangle_t t1 = omesh1->fmesh->tris_vect[tb_it->first];
            cdt_mesh::triangle_t t2 = omesh2->fmesh->tris_vect[tb_it->second];
-           int isect = tri_isect(omesh1, t1, omesh2, t2);
+           int isect = tri_isect(omesh1, t1, omesh2, t2, NULL);
            if (!isect) continue;
 
            done = false;

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