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