Revision: 73810
          http://sourceforge.net/p/brlcad/code/73810
Author:   starseeker
Date:     2019-08-31 20:58:11 +0000 (Sat, 31 Aug 2019)
Log Message:
-----------
Continue splitting edges until tolerances are met.

Modified Paths:
--------------
    brlcad/trunk/src/libbrep/cdt2.cpp
    brlcad/trunk/src/libbrep/cdt_util.cpp

Modified: brlcad/trunk/src/libbrep/cdt2.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt2.cpp   2019-08-31 19:29:27 UTC (rev 73809)
+++ brlcad/trunk/src/libbrep/cdt2.cpp   2019-08-31 20:58:11 UTC (rev 73810)
@@ -696,7 +696,6 @@
 
     // 1.  Any edges with at least 1 closed trim are split.
     if (trim1->IsClosed() || trim2->IsClosed()) {
-       std::cout << "ec split : \n";
        esegs_closed = split_edge_seg(s_cdt, e, 1);
        if (!esegs_closed.size()) {
            // split failed??
@@ -1006,15 +1005,27 @@
            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;
+           std::set<cdt_mesh::bedge_seg_t *> *ns = &ws2;
            for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
                cdt_mesh::bedge_seg_t *b = *e_it;
-               std::set<cdt_mesh::bedge_seg_t *> esegs_split;
-               esegs_split = split_edge_seg(s_cdt, b, 0);
+               ws->insert(b);
+           }
+           while (ws->size()) {
+               cdt_mesh::bedge_seg_t *b = *ws->begin();
+               ws->erase(ws->begin());
+               std::set<cdt_mesh::bedge_seg_t *> esegs_split = 
split_edge_seg(s_cdt, b, 0);
                if (esegs_split.size()) {
-                   new_segs.insert(esegs_split.begin(), esegs_split.end());
+                   ns->insert(esegs_split.begin(), esegs_split.end());
                } else {
                    new_segs.insert(b);
                }
+               if (!ws->size() && ns->size()) {
+                   std::set<cdt_mesh::bedge_seg_t *> *tmp = ws;
+                   ws = ns;
+                   ns = tmp;
+               }
            }
            s_cdt->e2polysegs[edge.m_edge_index].clear();
            s_cdt->e2polysegs[edge.m_edge_index].insert(new_segs.begin(), 
new_segs.end());
@@ -1086,19 +1097,31 @@
     for (int index = 0; index < brep->m_E.Count(); index++) {
        ON_BrepEdge& edge = brep->m_E[index];
        const ON_Curve* crv = edge.EdgeCurveOf();
-       if (crv->IsLinear(BN_TOL_DIST)) {
+       if (crv && crv->IsLinear(BN_TOL_DIST)) {
            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;
+           std::set<cdt_mesh::bedge_seg_t *> *ns = &ws2;
            for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
                cdt_mesh::bedge_seg_t *b = *e_it;
-               std::set<cdt_mesh::bedge_seg_t *> esegs_split;
-               esegs_split = split_edge_seg(s_cdt, b, 0);
+               ws->insert(b);
+           }
+           while (ws->size()) {
+               cdt_mesh::bedge_seg_t *b = *ws->begin();
+               ws->erase(ws->begin());
+               std::set<cdt_mesh::bedge_seg_t *> esegs_split = 
split_edge_seg(s_cdt, b, 0);
                if (esegs_split.size()) {
-                   new_segs.insert(esegs_split.begin(), esegs_split.end());
+                   ns->insert(esegs_split.begin(), esegs_split.end());
                } else {
                    new_segs.insert(b);
                }
+               if (!ws->size() && ns->size()) {
+                   std::set<cdt_mesh::bedge_seg_t *> *tmp = ws;
+                   ws = ns;
+                   ns = tmp;
+               }
            }
            s_cdt->e2polysegs[edge.m_edge_index].clear();
            s_cdt->e2polysegs[edge.m_edge_index].insert(new_segs.begin(), 
new_segs.end());

Modified: brlcad/trunk/src/libbrep/cdt_util.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_util.cpp       2019-08-31 19:29:27 UTC (rev 
73809)
+++ brlcad/trunk/src/libbrep/cdt_util.cpp       2019-08-31 20:58:11 UTC (rev 
73810)
@@ -710,7 +710,7 @@
     s->absmin = (s->absmax < s->absmin) ? s->absmax : s->absmin;
 
     // Get the normal based parameter as well
-    s->tol.norm = 2*ON_PI/180;
+    s->tol.norm = 40*ON_PI/180;
     if (s->tol.norm > ON_ZERO_TOLERANCE) {
        s->cos_within_ang = cos(s->tol.norm);
     } else {

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