Revision: 73859
          http://sourceforge.net/p/brlcad/code/73859
Author:   starseeker
Date:     2019-09-09 13:18:12 +0000 (Mon, 09 Sep 2019)
Log Message:
-----------
Experiment with building up the initial 2d rtrees as we're doing the initial 
splitting.

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

Modified: brlcad/trunk/src/libbrep/cdt_edge.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_edge.cpp       2019-09-08 15:03:47 UTC (rev 
73858)
+++ brlcad/trunk/src/libbrep/cdt_edge.cpp       2019-09-09 13:18:12 UTC (rev 
73859)
@@ -715,6 +715,10 @@
     bseg2->tan_start = edge_mid_tan;
     bseg2->tan_end = bseg->tan_end;
 
+    // Remove the old segments from their respective rtrees
+    rtree_bbox_2d_remove(s_cdt, bseg->tseg1);
+    rtree_bbox_2d_remove(s_cdt, bseg->tseg2);
+
     // Using the 2d mid points, update the polygons associated with tseg1 and 
tseg2.
     cdt_mesh::cpolyedge_t *poly1_ne1, *poly1_ne2, *poly2_ne1, *poly2_ne2;
     {
@@ -782,6 +786,22 @@
     nedges.insert(bseg1);
     nedges.insert(bseg2);
 
+    // Update the rtrees with the new segments
+
+    rtree_bbox_2d(s_cdt, bseg1->tseg1);
+    rtree_bbox_2d(s_cdt, bseg1->tseg2);
+    rtree_bbox_2d(s_cdt, bseg2->tseg1);
+    rtree_bbox_2d(s_cdt, bseg2->tseg2);
+
+    struct bu_vls fname = BU_VLS_INIT_ZERO;
+    int face_index = 
s_cdt->brep->m_T[bseg1->tseg1->trim_ind].Face()->m_face_index;
+    bu_vls_sprintf(&fname, "%d-rtree_2d_split_update.plot3", face_index);
+    plot_rtree_2d2(s_cdt->trim_segs[face_index], bu_vls_cstr(&fname));
+    face_index = s_cdt->brep->m_T[bseg2->tseg1->trim_ind].Face()->m_face_index;
+    bu_vls_sprintf(&fname, "%d-rtree_2d_split_update.plot3", face_index);
+    plot_rtree_2d2(s_cdt->trim_segs[face_index], bu_vls_cstr(&fname));
+    bu_vls_free(&fname);
+
     delete bseg;
     return nedges;
 }
@@ -1211,11 +1231,13 @@
 
                struct cdt_mesh::edge_t lseg(pv, cv);
                cdt_mesh::cpolyedge_t *ne = cpoly->add_ordered_edge(lseg);
+       
                ne->trim_ind = trim->m_trim_index;
-
                ne->trim_start = range.m_t[0];
                ne->trim_end = range.m_t[1];
 
+               rtree_bbox_2d(s_cdt, ne);
+
                if (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
@@ -1238,6 +1260,10 @@
                }
            }
        }
+       struct bu_vls fname = BU_VLS_INIT_ZERO;
+       bu_vls_sprintf(&fname, "%d-rtree_2d_initial.plot3", face_index);
+       plot_rtree_2d2(s_cdt->trim_segs[face_index], bu_vls_cstr(&fname));
+       bu_vls_free(&fname);
     }
     return true;
 }
@@ -1588,6 +1614,121 @@
     }
 }
 
+void
+refine_close_edges(struct ON_Brep_CDT_State *s_cdt)
+{
+    ON_Brep* brep = s_cdt->brep;
+
+    // First, build the loop rtree and get the median lengths again.  This 
time we use all loop
+    // segments, not just curved segments.
+    for (int index = 0; index < brep->m_L.Count(); index++) {
+
+       // Build the rtree leaf
+       rtree_loop_2d(s_cdt, index);
+
+       // Get inclusive median length
+       const ON_BrepLoop &loop = brep->m_L[index];
+       std::vector<double> lsegs;
+       for (int lti = 0; lti < loop.TrimCount(); lti++) {
+           ON_BrepTrim *trim = loop.Trim(lti);
+           ON_BrepEdge *edge = trim->Edge();
+           if (!edge) continue;
+           const ON_Curve* crv = edge->EdgeCurveOf();
+           if (!crv) continue;
+           std::set<cdt_mesh::bedge_seg_t *> &epsegs = 
s_cdt->e2polysegs[edge->m_edge_index];
+           if (!epsegs.size()) continue;
+           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);
+               lsegs.push_back(seg_dist);
+           }
+       }
+       s_cdt->l_median_len[index] = median_seg_len(lsegs);
+    }
+
+    // Now, check all the edge segments to see if we are close to a loop with
+    // smaller segments (or if our own loop has a median segment length smaller
+    // than the current segment.)  If so, split.
+    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) continue;
+       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;
+           ws->insert(b);
+       }
+       while (ws->size()) {
+           cdt_mesh::bedge_seg_t *b = *ws->begin();
+           ws->erase(ws->begin());
+           bool split_edge = false;
+           double target_len = DBL_MAX;
+           for (int i = 0; i < 2; i++) {
+               ON_BrepTrim *trim = edge.Trim(i);
+               ON_BrepFace *face = trim->Face();
+
+               // Get segment length - should be smaller than our target 
length.
+               cdt_mesh::cpolyedge_t *tseg = (b->tseg1->trim_ind == 
trim->m_trim_index) ? b->tseg1 : b->tseg2;
+               ON_2dPoint p2d1 = 
s_cdt->brep->m_T[tseg->trim_ind].PointAt(tseg->trim_start);
+               ON_2dPoint p2d2 = 
s_cdt->brep->m_T[tseg->trim_ind].PointAt(tseg->trim_end);
+               ON_Line l(p2d1, p2d2);
+               double slen = l.Length();
+               // Trim 2D bbox
+               ON_BoundingBox tbb(p2d1, p2d2);
+               double tMin[2];
+               double tMax[2];
+               double xbump = (fabs(tbb.Max().x - tbb.Min().x)) < slen ? 
0.8*slen : ON_ZERO_TOLERANCE;
+               double ybump = (fabs(tbb.Max().y - tbb.Min().y)) < slen ? 
0.8*slen : ON_ZERO_TOLERANCE;
+               tMin[0] = tbb.Min().x - xbump;
+               tMin[1] = tbb.Min().y - ybump;
+               tMax[0] = tbb.Max().x + xbump;
+               tMax[1] = tbb.Max().y + ybump;
+
+               // Edge context info
+               struct rtree_loop_context a_context;
+               a_context.seg_len = l.Length();
+               a_context.split_edge = &split_edge;
+               a_context.target_len = DBL_MAX;
+
+               // Do the search
+               if (!s_cdt->loops_2d[face->m_face_index].Search(tMin, tMax, 
Loop2dCallback, (void *)&a_context)) {
+                   continue;
+               } else {
+                   target_len = (a_context.target_len < target_len) ? 
a_context.target_len : target_len;
+               }
+           }
+
+           if (split_edge) {
+               // If we need to split, do so
+               std::set<cdt_mesh::bedge_seg_t *> esegs_split = 
split_edge_seg(s_cdt, b, 1);
+               if (esegs_split.size()) {
+                   ws->insert(esegs_split.begin(), esegs_split.end());
+               } else {
+                   new_segs.insert(b);
+               }
+           } 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());
+    }
+}
+
+
+
+
 /** @} */
 
 // Local Variables:

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