Revision: 73908
          http://sourceforge.net/p/brlcad/code/73908
Author:   starseeker
Date:     2019-09-12 17:42:00 +0000 (Thu, 12 Sep 2019)
Log Message:
-----------
Make edge splitter responsible for maintaining e2polysegs

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

Modified: brlcad/trunk/src/libbrep/cdt.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt.cpp    2019-09-12 15:56:29 UTC (rev 73907)
+++ brlcad/trunk/src/libbrep/cdt.cpp    2019-09-12 17:42:00 UTC (rev 73908)
@@ -187,9 +187,9 @@
            if (!edge) continue;
            const ON_Curve* crv = edge->EdgeCurveOf();
            if (!crv) continue;
-           std::vector<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge->m_edge_index];
+           std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge->m_edge_index];
            if (!epsegs.size()) continue;
-           std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+           std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
            for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
                cdt_mesh::bedge_seg_t *b = *e_it;
                double seg_dist = b->e_start->DistanceTo(*b->e_end);
@@ -495,9 +495,9 @@
        }
 
        // Initialize the tangents.
-       std::map<int, std::vector<cdt_mesh::bedge_seg_t *>>::iterator epoly_it;
+       std::map<int, std::set<cdt_mesh::bedge_seg_t *>>::iterator epoly_it;
        for (epoly_it = s_cdt->e2polysegs.begin(); epoly_it != 
s_cdt->e2polysegs.end(); epoly_it++) {
-           std::vector<cdt_mesh::bedge_seg_t *>::iterator seg_it;
+           std::set<cdt_mesh::bedge_seg_t *>::iterator seg_it;
            for (seg_it = epoly_it->second.begin(); seg_it != 
epoly_it->second.end(); seg_it++) {
                cdt_mesh::bedge_seg_t *bseg = *seg_it;
                double ts1 = bseg->tseg1->trim_start;
@@ -651,11 +651,13 @@
 #if 1
        for (int index = 0; index < brep->m_F.Count(); index++) {
            struct bu_vls fname = BU_VLS_INIT_ZERO;
-           bu_vls_sprintf(&fname, "%d-rtree_outer_polygon.plot3", index);
+           bu_vls_sprintf(&fname, "%d-rtree_outer_polygon_2d.plot3", index);
            cdt_mesh::cdt_mesh_t *fmesh = &s_cdt->fmeshes[index];
            fmesh->polygon_plot_2d(&fmesh->outer_loop, bu_vls_cstr(&fname));
            bu_vls_sprintf(&fname, "%d-rtree_2d.plot3", index);
            plot_rtree_2d2(s_cdt->face_rtrees_2d[index], bu_vls_cstr(&fname));
+           bu_vls_sprintf(&fname, "%d-rtree_outer_polygon_3d.plot3", index);
+           fmesh->polygon_plot_3d(&fmesh->outer_loop, bu_vls_cstr(&fname));
            // TODO - NIST2 259 3D rtree is clearly wrong
            bu_vls_sprintf(&fname, "%d-rtree_3d.plot3", index);
            plot_rtree_3d(s_cdt->face_rtrees_3d[index], bu_vls_cstr(&fname));

Modified: brlcad/trunk/src/libbrep/cdt.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt.h      2019-09-12 15:56:29 UTC (rev 73907)
+++ brlcad/trunk/src/libbrep/cdt.h      2019-09-12 17:42:00 UTC (rev 73908)
@@ -122,7 +122,7 @@
     std::map<int, double> *max_edge_seg_len;
     std::map<ON_3dPoint *, std::set<BrepTrimPoint *>> *on_brep_edge_pnts;
     std::map<int, struct BrepEdgeSegment *> *etrees;
-    std::map<int, std::vector<cdt_mesh::bedge_seg_t *>> e2polysegs;
+    std::map<int, std::set<cdt_mesh::bedge_seg_t *>> e2polysegs;
     std::map<ON_3dPoint *, double> v_min_seg_len;
     std::map<int, double> l_median_len;
 

Modified: brlcad/trunk/src/libbrep/cdt_edge.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_edge.cpp       2019-09-12 15:56:29 UTC (rev 
73907)
+++ brlcad/trunk/src/libbrep/cdt_edge.cpp       2019-09-12 17:42:00 UTC (rev 
73908)
@@ -356,8 +356,8 @@
 edge_median_seg_len(struct ON_Brep_CDT_State *s_cdt, int m_edge_index)
 {
     std::vector<double> lsegs;
-    std::vector<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[m_edge_index];
-    std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+    std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[m_edge_index];
+    std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
     for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
        cdt_mesh::bedge_seg_t *b = *e_it;
        double seg_dist = b->e_start->DistanceTo(*b->e_end);
@@ -806,6 +806,11 @@
 #endif
     }
 
+    // Let e2polysegs know about the changes
+    s_cdt->e2polysegs[edge.m_edge_index].erase(bseg);
+    s_cdt->e2polysegs[edge.m_edge_index].insert(bseg1);
+    s_cdt->e2polysegs[edge.m_edge_index].insert(bseg2);
+
     delete bseg;
     return nedges;
 }
@@ -823,9 +828,9 @@
        if (!edge) continue;
        const ON_Curve* crv = edge->EdgeCurveOf();
        if (!crv) continue;
-       std::vector<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge->m_edge_index];
+       std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge->m_edge_index];
        if (!epsegs.size()) continue;
-       std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+       std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
        for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
            cdt_mesh::bedge_seg_t *b = *e_it;
            double seg_dist = b->e_start->DistanceTo(*b->e_end);
@@ -853,9 +858,9 @@
            if (!crv || crv->IsLinear(BN_TOL_DIST)) {
                continue;
            }
-           std::vector<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge->m_edge_index];
+           std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge->m_edge_index];
            if (!epsegs.size()) continue;
-           std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+           std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
            std::set<cdt_mesh::bedge_seg_t *> new_segs;
            std::set<cdt_mesh::bedge_seg_t *> ws1, ws2;
            std::set<cdt_mesh::bedge_seg_t *> *ws = &ws1;
@@ -955,10 +960,10 @@
 bool
 initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt)
 {
-    std::map<int, std::vector<cdt_mesh::bedge_seg_t *>>::iterator epoly_it;
+    std::map<int, std::set<cdt_mesh::bedge_seg_t *>>::iterator epoly_it;
     for (epoly_it = s_cdt->e2polysegs.begin(); epoly_it != 
s_cdt->e2polysegs.end(); epoly_it++) {
-       std::vector<cdt_mesh::bedge_seg_t *>::iterator seg_it;
-       std::vector<cdt_mesh::bedge_seg_t *> wsegs = epoly_it->second;
+       std::set<cdt_mesh::bedge_seg_t *>::iterator seg_it;
+       std::set<cdt_mesh::bedge_seg_t *> wsegs = epoly_it->second;
        for (seg_it = wsegs.begin(); seg_it != wsegs.end(); seg_it++) {
            cdt_mesh::bedge_seg_t *e = *seg_it;
 
@@ -1018,7 +1023,7 @@
            }
 
            s_cdt->e2polysegs[edge.m_edge_index].clear();
-           std::copy(esegs_csplit.begin(), esegs_csplit.end(), 
std::back_inserter(s_cdt->e2polysegs[edge.m_edge_index]));
+           s_cdt->e2polysegs[edge.m_edge_index] = esegs_csplit;
        }
     }
 
@@ -1145,7 +1150,7 @@
        // Stash the edge type - we will need it during refinement
        bseg->edge_type = edge_type[edge.m_edge_index];
 
-       s_cdt->e2polysegs[edge.m_edge_index].push_back(bseg);
+       s_cdt->e2polysegs[edge.m_edge_index].insert(bseg);
     }
 }
 
@@ -1262,7 +1267,7 @@
                rtree_bbox_2d(s_cdt, ne, 0);
 
                if (trim->m_ei >= 0) {
-                   cdt_mesh::bedge_seg_t *eseg = 
s_cdt->e2polysegs[trim->m_ei][0];
+                   cdt_mesh::bedge_seg_t *eseg = 
*s_cdt->e2polysegs[trim->m_ei].begin();
                    // Associate the edge segment with the trim segment and 
vice versa
                    ne->eseg = eseg;
                    if (eseg->tseg1 && eseg->tseg2) {
@@ -1305,8 +1310,8 @@
        // TODO - BN_TOL_DIST will be too large for very small trims - need to 
do
        // something similar to the ptol calculation for these edge curves...
        if (crv && !crv->IsLinear(BN_TOL_DIST)) {
-           std::vector<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge.m_edge_index];
-           std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+           std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge.m_edge_index];
+           std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
            std::set<cdt_mesh::bedge_seg_t *> new_segs;
            std::set<cdt_mesh::bedge_seg_t *> ws1, ws2;
            std::set<cdt_mesh::bedge_seg_t *> *ws = &ws1;
@@ -1331,7 +1336,7 @@
                }
            }
            s_cdt->e2polysegs[edge.m_edge_index].clear();
-           std::copy(new_segs.begin(), new_segs.end(), 
std::back_inserter(s_cdt->e2polysegs[edge.m_edge_index]));
+           s_cdt->e2polysegs[edge.m_edge_index] = new_segs;
        }
     }
 }
@@ -1347,8 +1352,8 @@
        double emin = DBL_MAX;
        for (int j = 0; j < brep->m_V[i].m_ei.Count(); j++) {
            ON_BrepEdge &edge = brep->m_E[brep->m_V[i].m_ei[j]];
-           std::vector<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge.m_edge_index];
-           std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+           std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge.m_edge_index];
+           std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
            for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
                cdt_mesh::bedge_seg_t *b = *e_it;
                if (b->e_start == p3d || b->e_end == p3d) {
@@ -1381,9 +1386,9 @@
            if (!crv || crv->IsLinear(BN_TOL_DIST)) {
                continue;
            }
-           std::vector<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge->m_edge_index];
+           std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge->m_edge_index];
            if (!epsegs.size()) continue;
-           std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+           std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
            for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
                cdt_mesh::bedge_seg_t *b = *e_it;
                double seg_dist = b->e_start->DistanceTo(*b->e_end);
@@ -1446,8 +1451,8 @@
     for (r_it = refine_targets.begin(); r_it != refine_targets.end(); r_it++) {
        ON_BrepEdge& edge = brep->m_E[r_it->first];
        double split_tol = r_it->second;
-       std::vector<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[r_it->first];
-       std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+       std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[r_it->first];
+       std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
        std::set<cdt_mesh::bedge_seg_t *> new_segs;
        std::set<cdt_mesh::bedge_seg_t *> ws1, ws2;
        std::set<cdt_mesh::bedge_seg_t *> *ws = &ws1;
@@ -1478,7 +1483,7 @@
            }
        }
        s_cdt->e2polysegs[edge.m_edge_index].clear();
-       std::copy(new_segs.begin(), new_segs.end(), 
std::back_inserter(s_cdt->e2polysegs[edge.m_edge_index]));
+       s_cdt->e2polysegs[edge.m_edge_index] = new_segs;
     }
 
 }
@@ -1496,8 +1501,8 @@
        ON_BrepEdge& edge = brep->m_E[index];
        const ON_Curve* crv = edge.EdgeCurveOf();
        if (crv && crv->IsLinear(BN_TOL_DIST)) {
-           std::vector<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge.m_edge_index];
-           std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+           std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge.m_edge_index];
+           std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
            std::set<cdt_mesh::bedge_seg_t *> new_segs;
            std::set<cdt_mesh::bedge_seg_t *> ws1, ws2;
            std::set<cdt_mesh::bedge_seg_t *> *ws = &ws1;
@@ -1522,7 +1527,7 @@
                }
            }
            s_cdt->e2polysegs[edge.m_edge_index].clear();
-           std::copy(new_segs.begin(), new_segs.end(), 
std::back_inserter(s_cdt->e2polysegs[edge.m_edge_index]));
+           s_cdt->e2polysegs[edge.m_edge_index] = new_segs;
        }
     }
 
@@ -1555,7 +1560,6 @@
        int split_cnt = 0;
        while (ws.size() && split_cnt < 10) {
            std::vector<cdt_mesh::cpolyedge_t *> current_trims;
-           std::map<int, std::vector<cdt_mesh::bedge_seg_t *>> curr_edge_segs;
 
            bool split_check = false;
 
@@ -1623,12 +1627,10 @@
                    // Get both of them in case they're both in ws (closed face)
                    ws_s.erase(b->tseg1);
                    ws_s.erase(b->tseg2);
-                   int edge_ind = b->edge_ind;
                    if (pe->split_status == 2) {
                        std::set<cdt_mesh::bedge_seg_t *> esegs_split = 
split_edge_seg(s_cdt, b, 1, 1);
                        if (esegs_split.size()) {
                            split_check = true;
-                           std::copy(esegs_split.begin(), esegs_split.end(), 
std::back_inserter(curr_edge_segs[edge_ind]));
                            // Pick up the new trim segments from the edges for 
the next iteration.  Only
                            // want the ones associated with the current face.
                            std::set<cdt_mesh::bedge_seg_t *>::iterator b_it;
@@ -1640,14 +1642,10 @@
                        } else {
                            // This is probably fatal...
                            std::cerr << "Forced edge split failed???\n";
-                           curr_edge_segs[edge_ind].push_back(b);
                            current_trims.push_back(pe);
                        }
                    } else if (pe->split_status == 1) {
-                       curr_edge_segs[edge_ind].push_back(b);
                        current_trims.push_back(pe);
-                   } else {
-                       curr_edge_segs[edge_ind].push_back(b);
                    }
                } else {
                    // Trim only, no edge.
@@ -1686,14 +1684,6 @@
                }
            }
 
-           // Once we're done with this round of splitting, update the 
e2polysegs sets
-           std::map<int, std::vector<cdt_mesh::bedge_seg_t *>>::iterator m_it;
-           for (m_it = curr_edge_segs.begin(); m_it != curr_edge_segs.end(); 
m_it++) {
-               int m_edge_index = m_it->first;
-               s_cdt->e2polysegs[m_edge_index].clear();
-               std::copy(m_it->second.begin(), m_it->second.end(), 
std::back_inserter(s_cdt->e2polysegs[m_edge_index]));
-           }
-
 #if 0
            struct bu_vls fname = BU_VLS_INIT_ZERO;
            bu_vls_sprintf(&fname, "%d-rtree_2d_split_update_%d.plot3", 
face.m_face_index, split_cnt);
@@ -1756,8 +1746,8 @@
     }
 
     for (int index = 0; index < brep->m_E.Count(); index++) {
-       std::vector<cdt_mesh::bedge_seg_t *> &epsegs = s_cdt->e2polysegs[index];
-       std::vector<cdt_mesh::bedge_seg_t *>::iterator e_it;
+       std::set<cdt_mesh::bedge_seg_t *> &epsegs = s_cdt->e2polysegs[index];
+       std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
        for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
            cdt_mesh::bedge_seg_t *b = *e_it;
            rtree_bbox_3d(s_cdt, b->tseg1);

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