Revision: 73863
http://sourceforge.net/p/brlcad/code/73863
Author: starseeker
Date: 2019-09-09 20:18:24 +0000 (Mon, 09 Sep 2019)
Log Message:
-----------
Add some debug printing. Getting an unexpected miss in the rtree search, not
sure yet if I'm giving it bad input or it's a bug in the tree...
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt_edge.cpp
brlcad/trunk/src/libbrep/cdt_util.cpp
Modified: brlcad/trunk/src/libbrep/cdt_edge.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-09 19:35:03 UTC (rev
73862)
+++ brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-09 20:18:24 UTC (rev
73863)
@@ -315,6 +315,8 @@
cdt_mesh::cpolyedge_t *tseg = (cdt_mesh::cpolyedge_t *)data;
struct rtree_minsplit_context *context= (struct rtree_minsplit_context
*)a_context;
+ plot_ce_bbox(context->s_cdt, tseg, "l.p3");
+
// Intersecting with oneself or immediate neighbors isn't cause for
splitting
if (tseg == context->cseg || tseg == context->cseg->prev || tseg ==
context->cseg->next) return true;
@@ -1621,12 +1623,9 @@
ON_Brep* brep = s_cdt->brep;
for (int index = 0; index < brep->m_L.Count(); index++) {
- std::map<int, std::set<cdt_mesh::bedge_seg_t *>> new_edge_segs;
const ON_BrepLoop &loop = brep->m_L[index];
ON_BrepFace *face = loop.Face();
- 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;
+ std::set<cdt_mesh::bedge_seg_t *> ws;
// Build the initial set to check (all edges associated with a loop
trim)
for (int lti = 0; lti < loop.TrimCount(); lti++) {
@@ -1640,7 +1639,7 @@
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;
- ws->insert(b);
+ ws.insert(b);
}
}
@@ -1647,16 +1646,24 @@
// Check all the edge segments associated with the loop to see if our
bounding box overlaps with boxes
// that aren't our neighbor boxes. For any that do, split and check
again. Keep refining until we
// don't have any non-neighbor overlaps.
- while (ws->size()) {
+ int split_cnt = 0;
+ while (ws.size()) {
std::set<cdt_mesh::bedge_seg_t *> to_split;
std::set<cdt_mesh::bedge_seg_t *>::iterator w_it;
- for (w_it = ws->begin(); w_it != ws->end(); w_it++) {
+ std::map<int, std::set<cdt_mesh::bedge_seg_t *>> curr_edge_segs;
+
+ bool split_check = false;
+
+ if (split_cnt) {
+ std::cout << "Face " << face->m_face_index << " loop " <<
loop.m_loop_index << " split_cnt " << split_cnt << "\n";
+ }
+ for (w_it = ws.begin(); w_it != ws.end(); w_it++) {
cdt_mesh::bedge_seg_t *b = *w_it;
// Get segment length - should be smaller than our target
length.
cdt_mesh::cpolyedge_t *tseg =
(s_cdt->brep->m_T[b->tseg1->trim_ind].Face()->m_face_index ==
face->m_face_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);
-
+
// Trim 2D bbox
ON_BoundingBox bb(p2d1, p2d2);
bb.m_max.x = bb.m_max.x + ON_ZERO_TOLERANCE;
@@ -1683,6 +1690,8 @@
tMax[0] = bb.Max().x;
tMax[1] = bb.Max().y;
+ plot_ce_bbox(s_cdt, tseg, "c.p3");
+
// Edge context info
struct rtree_minsplit_context a_context;
a_context.s_cdt = s_cdt;
@@ -1694,35 +1703,45 @@
}
// If we need to split, do so
- for (w_it = ws->begin(); w_it != ws->end(); w_it++) {
+ for (w_it = ws.begin(); w_it != ws.end(); w_it++) {
cdt_mesh::bedge_seg_t *b = *w_it;
if (to_split.find(*w_it) != to_split.end()) {
std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 1);
if (esegs_split.size()) {
- ns->insert(esegs_split.begin(), esegs_split.end());
+ curr_edge_segs[b->edge_ind].insert(esegs_split.begin(),
esegs_split.end());
+ split_check = true;
} else {
- new_edge_segs[b->edge_ind].insert(b);
+ curr_edge_segs[b->edge_ind].insert(b);
}
} else {
- new_edge_segs[b->edge_ind].insert(b);
+ curr_edge_segs[b->edge_ind].insert(b);
}
}
- ws->clear();
- if (ns->size()) {
- std::set<cdt_mesh::bedge_seg_t *> *tmp = ws;
- ws = ns;
- ns = tmp;
+
+ ws.clear();
+
+ std::map<int, std::set<cdt_mesh::bedge_seg_t *>>::iterator m_it;
+ if (split_check) {
+ for (m_it = curr_edge_segs.begin(); m_it !=
curr_edge_segs.end(); m_it++) {
+ ws.insert(m_it->second.begin(), m_it->second.end());
+ }
}
+ split_cnt++;
+
+ // Once we're done with this round of splitting, update the
e2polysegs sets
+ 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();
+ s_cdt->e2polysegs[m_edge_index].insert(m_it->second.begin(),
m_it->second.end());
+ }
+
+ 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);
+ plot_rtree_2d2(s_cdt->trim_segs[face->m_face_index],
bu_vls_cstr(&fname));
+ bu_vls_free(&fname);
}
- // Once we're done with this loop, update the e2polysegs sets
- std::map<int, std::set<cdt_mesh::bedge_seg_t *>>::iterator m_it;
- for (m_it = new_edge_segs.begin(); m_it != new_edge_segs.end(); m_it++)
{
- int m_edge_index = m_it->first;
- s_cdt->e2polysegs[m_edge_index].clear();
- s_cdt->e2polysegs[m_edge_index].insert(m_it->second.begin(),
m_it->second.end());
- }
- }
+ }
}
Modified: brlcad/trunk/src/libbrep/cdt_util.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_util.cpp 2019-09-09 19:35:03 UTC (rev
73862)
+++ brlcad/trunk/src/libbrep/cdt_util.cpp 2019-09-09 20:18:24 UTC (rev
73863)
@@ -104,7 +104,7 @@
++tree_it;
}
- //rtree.Save("test.rtree");
+ rtree.Save("test.rtree");
fclose(plot_file);
}
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