Revision: 73856
http://sourceforge.net/p/brlcad/code/73856
Author: starseeker
Date: 2019-09-07 23:01:42 +0000 (Sat, 07 Sep 2019)
Log Message:
-----------
move the iteration down into the initialize_edge_segs function.
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-07 22:51:47 UTC (rev 73855)
+++ brlcad/trunk/src/libbrep/cdt.cpp 2019-09-07 23:01:42 UTC (rev 73856)
@@ -510,16 +510,9 @@
}
// Do the non-tolerance based initialization splits.
- for (epoly_it = s_cdt->e2polysegs.begin(); epoly_it !=
s_cdt->e2polysegs.end(); epoly_it++) {
- 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 *bseg = *seg_it;
-
- if (!initialize_edge_segs(s_cdt, bseg)) {
- std::cout << "Initialization failed for edge " <<
epoly_it->first << "\n";
- }
- }
+ if (!initialize_edge_segs(s_cdt)) {
+ std::cout << "Initialization failed for edges\n";
+ return -1;
}
// Check the CDT meshing - at this point, we should be able to produce
Modified: brlcad/trunk/src/libbrep/cdt.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt.h 2019-09-07 22:51:47 UTC (rev 73855)
+++ brlcad/trunk/src/libbrep/cdt.h 2019-09-07 23:01:42 UTC (rev 73856)
@@ -190,7 +190,7 @@
std::set<cdt_mesh::cpolyedge_t *>
split_singular_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::cpolyedge_t *ce);
-bool initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt,
cdt_mesh::bedge_seg_t *e);
+bool initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt);
std::vector<int> characterize_edges(struct ON_Brep_CDT_State *s_cdt);
void initialize_edge_containers(struct ON_Brep_CDT_State *s_cdt);
bool initialize_loop_polygons(struct ON_Brep_CDT_State *s_cdt,
std::set<cdt_mesh::cpolyedge_t *> *singular_edges);
Modified: brlcad/trunk/src/libbrep/cdt_edge.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-07 22:51:47 UTC (rev
73855)
+++ brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-07 23:01:42 UTC (rev
73856)
@@ -882,67 +882,77 @@
// beginning regardless of tolerance settings. Do them up front so the
subsequent
// working set has consistent properties.
bool
-initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::bedge_seg_t *e)
+initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt)
{
- ON_BrepEdge& edge = s_cdt->brep->m_E[e->edge_ind];
- ON_BrepTrim *trim1 = edge.Trim(0);
- ON_BrepTrim *trim2 = edge.Trim(1);
- std::set<cdt_mesh::bedge_seg_t *> esegs_closed;
+ 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::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;
- if (!trim1 || !trim2) return false;
- if (trim1->m_type == ON_BrepTrim::singular || trim1->m_type ==
ON_BrepTrim::singular) return false;
+ ON_BrepEdge& edge = s_cdt->brep->m_E[e->edge_ind];
+ ON_BrepTrim *trim1 = edge.Trim(0);
+ ON_BrepTrim *trim2 = edge.Trim(1);
+ std::set<cdt_mesh::bedge_seg_t *> esegs_closed;
- // 1. Any edges with at least 1 closed trim are split.
- if (trim1->IsClosed() || trim2->IsClosed()) {
- esegs_closed = split_edge_seg(s_cdt, e, 1);
- if (!esegs_closed.size()) {
- // split failed?? On a closed edge this is fatal - we must split it
- // to work with it at all
- return false;
- }
- } else {
- esegs_closed.insert(e);
- }
+ if (!trim1 || !trim2) return false;
- // 2. Any edges with a non-linear edge curve are split. (If non-linear
- // and closed, split again - a curved, closed curve must be split twice
- // to have chance of producing a non-degenerate polygon.)
- std::set<cdt_mesh::bedge_seg_t *> esegs_csplit;
- const ON_Curve* crv = edge.EdgeCurveOf();
- if (!crv->IsLinear(BN_TOL_DIST)) {
- std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
- for (e_it = esegs_closed.begin(); e_it != esegs_closed.end(); e_it++) {
- std::set<cdt_mesh::bedge_seg_t *> efirst = split_edge_seg(s_cdt,
*e_it, 1);
- if (!efirst.size()) {
- // split failed?? On a curved edge we must split at least once
to
- // avoid potentially degenerate polygons (if we had to split a
closed
- // loop from step 1, for example;
- return false;
+ if (trim1->m_type == ON_BrepTrim::singular || trim1->m_type ==
ON_BrepTrim::singular) return false;
+
+ // 1. Any edges with at least 1 closed trim are split.
+ if (trim1->IsClosed() || trim2->IsClosed()) {
+ esegs_closed = split_edge_seg(s_cdt, e, 1);
+ if (!esegs_closed.size()) {
+ // split failed?? On a closed edge this is fatal - we must
split it
+ // to work with it at all
+ return false;
+ }
} else {
- // To avoid representing circles with squares, split curved
segments
- // one additional time
- std::set<cdt_mesh::bedge_seg_t *>::iterator s_it;
- for (s_it = efirst.begin(); s_it != efirst.end(); s_it++) {
- std::set<cdt_mesh::bedge_seg_t *> etmp =
split_edge_seg(s_cdt, *s_it, 1);
- if (!etmp.size()) {
- // split failed?? This isn't good and shouldn't
- // happen, but it's not fatal the way the previous two
- // failure cases are...
- esegs_csplit.insert(*s_it);
+ esegs_closed.insert(e);
+ }
+
+ // 2. Any edges with a non-linear edge curve are split. (If
non-linear
+ // and closed, split again - a curved, closed curve must be split
twice
+ // to have chance of producing a non-degenerate polygon.)
+ std::set<cdt_mesh::bedge_seg_t *> esegs_csplit;
+ const ON_Curve* crv = edge.EdgeCurveOf();
+ if (!crv->IsLinear(BN_TOL_DIST)) {
+ std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
+ for (e_it = esegs_closed.begin(); e_it != esegs_closed.end();
e_it++) {
+ std::set<cdt_mesh::bedge_seg_t *> efirst =
split_edge_seg(s_cdt, *e_it, 1);
+ if (!efirst.size()) {
+ // split failed?? On a curved edge we must split at
least once to
+ // avoid potentially degenerate polygons (if we had to
split a closed
+ // loop from step 1, for example;
+ return false;
} else {
- esegs_csplit.insert(etmp.begin(), etmp.end());
+ // To avoid representing circles with squares, split
curved segments
+ // one additional time
+ std::set<cdt_mesh::bedge_seg_t *>::iterator s_it;
+ for (s_it = efirst.begin(); s_it != efirst.end();
s_it++) {
+ std::set<cdt_mesh::bedge_seg_t *> etmp =
split_edge_seg(s_cdt, *s_it, 1);
+ if (!etmp.size()) {
+ // split failed?? This isn't good and shouldn't
+ // happen, but it's not fatal the way the
previous two
+ // failure cases are...
+ esegs_csplit.insert(*s_it);
+ } else {
+ esegs_csplit.insert(etmp.begin(), etmp.end());
+ }
+ }
}
}
+ } else {
+ esegs_csplit = esegs_closed;
}
+
+ s_cdt->e2polysegs[edge.m_edge_index].clear();
+ s_cdt->e2polysegs[edge.m_edge_index].insert(esegs_csplit.begin(),
esegs_csplit.end());
}
- } else {
- esegs_csplit = esegs_closed;
}
- s_cdt->e2polysegs[edge.m_edge_index].clear();
- s_cdt->e2polysegs[edge.m_edge_index].insert(esegs_csplit.begin(),
esegs_csplit.end());
-
return true;
}
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