Revision: 73921
http://sourceforge.net/p/brlcad/code/73921
Author: starseeker
Date: 2019-09-12 23:11:51 +0000 (Thu, 12 Sep 2019)
Log Message:
-----------
adjust the singular_edges splitting logic to be updatable by split_singular_seg
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 21:30:15 UTC (rev 73920)
+++ brlcad/trunk/src/libbrep/cdt.cpp 2019-09-12 23:11:51 UTC (rev 73921)
@@ -489,8 +489,7 @@
// Next, for each face and each loop in each face define the initial
// loop polygons. Note there is no splitting of edges at this point -
// we are simply establishing the initial closed polygons.
- std::set<cdt_mesh::cpolyedge_t *> singular_edges;
- if (!initialize_loop_polygons(s_cdt, &singular_edges)) {
+ if (!initialize_loop_polygons(s_cdt)) {
return -1;
}
@@ -519,7 +518,7 @@
// If edge segments are too close together in 2D space compared to their
// length, it is difficult to mesh them successfully. Refine edges that
// are close to other edges.
- //refine_close_edges(s_cdt);
+ refine_close_edges(s_cdt);
#if 0
// On to tolerance based splitting. Process the non-linear edges first
-
@@ -539,29 +538,27 @@
// Split singularity trims in 2D to provide an easier input to the 2D
CDT logic. NOTE: these
// splits will produce degenerate (zero area, two identical vertex)
triangles in 3D that have
// to be cleaned up.
- if (singular_edges.size()) {
- std::set<cdt_mesh::cpolyedge_t *>::iterator s_it;
- for (s_it = singular_edges.begin(); s_it != singular_edges.end();
s_it++) {
- std::queue<cdt_mesh::cpolyedge_t *> w1, w2;
- std::queue<cdt_mesh::cpolyedge_t *> *wq, *nq, *tmpq;
- int cnt = 0;
- wq = &w1;
- nq = &w2;
- nq->push(*s_it);
- while (cnt < 6) {
- cnt = 0;
- tmpq = wq;
- wq = nq;
- nq = tmpq;
- while (!wq->empty()) {
- cdt_mesh::cpolyedge_t *ce = wq->front();
- wq->pop();
- std::set<cdt_mesh::cpolyedge_t *> nedges =
split_singular_seg(s_cdt, ce, 0);
- std::set<cdt_mesh::cpolyedge_t *>::iterator n_it;
- for (n_it = nedges.begin(); n_it != nedges.end();
n_it++) {
- nq->push(*n_it);
- cnt++;
- }
+ while (s_cdt->unsplit_singular_edges.size()) {
+ std::queue<cdt_mesh::cpolyedge_t *> w1, w2;
+ std::queue<cdt_mesh::cpolyedge_t *> *wq, *nq, *tmpq;
+ int cnt = 0;
+ wq = &w1;
+ nq = &w2;
+ nq->push(*(s_cdt->unsplit_singular_edges.begin()));
+
s_cdt->unsplit_singular_edges.erase(s_cdt->unsplit_singular_edges.begin());
+ while (cnt < 6) {
+ cnt = 0;
+ tmpq = wq;
+ wq = nq;
+ nq = tmpq;
+ while (!wq->empty()) {
+ cdt_mesh::cpolyedge_t *ce = wq->front();
+ wq->pop();
+ std::set<cdt_mesh::cpolyedge_t *> nedges =
split_singular_seg(s_cdt, ce, 0);
+ std::set<cdt_mesh::cpolyedge_t *>::iterator n_it;
+ for (n_it = nedges.begin(); n_it != nedges.end(); n_it++) {
+ nq->push(*n_it);
+ cnt++;
}
}
}
Modified: brlcad/trunk/src/libbrep/cdt.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt.h 2019-09-12 21:30:15 UTC (rev 73920)
+++ brlcad/trunk/src/libbrep/cdt.h 2019-09-12 23:11:51 UTC (rev 73921)
@@ -125,6 +125,7 @@
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;
+ std::set<cdt_mesh::cpolyedge_t *> unsplit_singular_edges;
/* Audit data */
std::map<int, ON_3dPoint *> *bot_pnt_to_on_pnt;
@@ -168,7 +169,7 @@
void refine_close_edges(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);
+bool initialize_loop_polygons(struct ON_Brep_CDT_State *s_cdt);
void tol_curved_edges_split(struct ON_Brep_CDT_State *s_cdt);
void update_vert_edge_seg_lengths(struct ON_Brep_CDT_State *s_cdt);
void update_loop_median_curved_edge_seg_lengths(struct ON_Brep_CDT_State
*s_cdt);
Modified: brlcad/trunk/src/libbrep/cdt_edge.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-12 21:30:15 UTC (rev
73920)
+++ brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-12 23:11:51 UTC (rev
73921)
@@ -922,6 +922,8 @@
rtree_bbox_2d_remove(s_cdt, ce);
}
+ s_cdt->unsplit_singular_edges.erase(ce);
+
// Using the 2d mid points, update the polygons associated with tseg1 and
tseg2.
cdt_mesh::cpolyedge_t *poly_ne1, *poly_ne2;
int v[2];
@@ -1160,7 +1162,7 @@
// loop polygons. Note there is no splitting of edges at this point -
// we are simply establishing the initial closed polygons.
bool
-initialize_loop_polygons(struct ON_Brep_CDT_State *s_cdt,
std::set<cdt_mesh::cpolyedge_t *> *singular_edges)
+initialize_loop_polygons(struct ON_Brep_CDT_State *s_cdt)
{
ON_Brep* brep = s_cdt->brep;
for (int face_index = 0; face_index < brep->m_F.Count(); face_index++) {
@@ -1287,7 +1289,7 @@
// A null eseg will indicate a singularity and a need for
special case
// splitting of the 2D edge only
ne->eseg = NULL;
- singular_edges->insert(ne);
+ s_cdt->unsplit_singular_edges.insert(ne);
fmesh->has_singularities = true;
}
}
@@ -1544,7 +1546,7 @@
for (int face_index = 0; face_index < brep->m_F.Count(); face_index++) {
ON_BrepFace &face = s_cdt->brep->m_F[face_index];
- std::cout << "Face " << face_index << " close edge check...\n";
+ std::cout << "Face " << face_index << " of " << brep->m_F.Count() << "
close edge check...\n";
std::vector<cdt_mesh::cpolyedge_t *> ws = cdt_face_polyedges(s_cdt,
face_index);
@@ -1567,7 +1569,7 @@
bool split_check = false;
-#if 1
+#if 0
if (split_cnt) {
std::cout << "Face " << face_index << " split_cnt " <<
split_cnt << "\n";
}
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