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

Reply via email to