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