Revision: 74282
          http://sourceforge.net/p/brlcad/code/74282
Author:   starseeker
Date:     2019-11-01 20:14:04 +0000 (Fri, 01 Nov 2019)
Log Message:
-----------
Get longest edges first, only grab 2 longest edges from a triangle.

Modified Paths:
--------------
    brlcad/trunk/src/libbrep/cdt_mesh.cpp
    brlcad/trunk/src/libbrep/cdt_mesh.h
    brlcad/trunk/src/libbrep/cdt_ovlps.cpp

Modified: brlcad/trunk/src/libbrep/cdt_mesh.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.cpp       2019-10-31 20:53:45 UTC (rev 
74281)
+++ brlcad/trunk/src/libbrep/cdt_mesh.cpp       2019-11-01 20:14:04 UTC (rev 
74282)
@@ -1896,6 +1896,45 @@
     return p.DistanceTo(l.PointAt(t));
 }
 
+class uedge_dist_t
+{
+    public:
+       uedge_t ue;
+       double dist;
+
+       bool operator < (const uedge_dist_t& other) const
+       {
+           return (dist < other.dist);
+       }
+};
+
+std::vector<uedge_t>
+cdt_mesh_t::sorted_uedges_l_to_s(std::set<uedge_t> &uedges)
+{
+    std::vector<uedge_dist_t> ued_vect;
+    std::set<uedge_t>::iterator ue_it;
+    for (ue_it = uedges.begin(); ue_it != uedges.end(); ue_it++) {
+       uedge_dist_t ued;
+       ued.ue = *ue_it;
+       ON_3dPoint p1, p2;
+       p1 = *pnts[ued.ue.v[0]];
+       p2 = *pnts[ued.ue.v[1]];
+       ued.dist = p1.DistanceTo(p2);
+       ued_vect.push_back(ued);
+    }
+
+    std::sort(ued_vect.begin(), ued_vect.end());
+    std::reverse(ued_vect.begin(), ued_vect.end());
+
+    std::vector<uedge_t> ue_sorted;
+    for (size_t i = 0; i < ued_vect.size(); i++) {
+       uedge_t ue = ued_vect[i].ue;
+       ue_sorted.push_back(ue);
+    }
+
+    return ue_sorted;
+}
+
 ON_3dVector
 cdt_mesh_t::tnorm(const triangle_t &t)
 {

Modified: brlcad/trunk/src/libbrep/cdt_mesh.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.h 2019-10-31 20:53:45 UTC (rev 74281)
+++ brlcad/trunk/src/libbrep/cdt_mesh.h 2019-11-01 20:14:04 UTC (rev 74282)
@@ -529,6 +529,8 @@
     // Find the distance to the closest point on a uedge
     double uedge_dist(uedge_t &ue, ON_3dPoint &p);
 
+    // Length sorted (longest to shortest) array of uedges in set.
+    std::vector<uedge_t> sorted_uedges_l_to_s(std::set<uedge_t> &uedges);
 
     // Plot3 generation routines for debugging
     void boundary_edges_plot(const char *filename);

Modified: brlcad/trunk/src/libbrep/cdt_ovlps.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-10-31 20:53:45 UTC (rev 
74281)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-11-01 20:14:04 UTC (rev 
74282)
@@ -129,6 +129,7 @@
        RTree<long, double, 3> vtree;
        void rebuild_vtree();
        void plot_vtree(const char *fname);
+       void save_vtree(const char *fname);
 
        void vert_adjust(long p_id, ON_3dPoint *p, ON_3dVector *v);
 
@@ -306,6 +307,12 @@
 }
 
 void
+omesh_t::save_vtree(const char *fname)
+{
+    vtree.Save(fname);
+}
+
+void
 omesh_t::plot(const char *fname)
 {
     struct bu_color c = BU_COLOR_INIT_ZERO;
@@ -1074,6 +1081,26 @@
     return ue;
 }
 
+cdt_mesh::uedge_t
+tri_shortest_edge(cdt_mesh::cdt_mesh_t *fmesh, long t_ind)
+{
+    cdt_mesh::uedge_t ue;
+    cdt_mesh::triangle_t t = fmesh->tris_vect[t_ind];
+    double len = DBL_MAX;
+    for (int i = 0; i < 3; i++) {
+       long v0 = t.v[i];
+       long v1 = (i < 2) ? t.v[i + 1] : t.v[0];
+       ON_3dPoint *p1 = fmesh->pnts[v0];
+       ON_3dPoint *p2 = fmesh->pnts[v1];
+       double d = p1->DistanceTo(*p2);
+       if (d < len) {
+           len = d;
+           ue = cdt_mesh::uedge_t(v0, v1);
+       }
+    }
+    return ue;
+}
+
 // TODO - need to update this to use the bn_fit_plane on two
 // triangles selected by an edge and check that projection,
 // not just the triangle - a point near an interior edge may not
@@ -2293,12 +2320,17 @@
        }
     }
 
+    // TODO -need to sort the uedges by longest edge length. Want to get the
+    // longest edges first, to push the new triangles towards equilateral
+    // status - long thin triangles are always trouble...
+
     for (o_it = omeshes.begin(); o_it != omeshes.end(); o_it++) {
        omesh_t *omesh = *o_it;
 
-       std::set<cdt_mesh::uedge_t>::iterator u_it;
-       for (u_it = omesh->split_edges.begin(); u_it != 
omesh->split_edges.end(); u_it++) {
-           cdt_mesh::uedge_t ue = *u_it;
+       std::vector<cdt_mesh::uedge_t> sorted_uedges = 
omesh->fmesh->sorted_uedges_l_to_s(omesh->split_edges);
+
+       for (size_t i = 0; i < sorted_uedges.size(); i++) {
+           cdt_mesh::uedge_t ue = sorted_uedges[i];
            ON_3dPoint p1 = *omesh->fmesh->pnts[ue.v[0]];
            ON_3dPoint p2 = *omesh->fmesh->pnts[ue.v[1]];
            double dist = p1.DistanceTo(p2);
@@ -2380,21 +2412,24 @@
            if (t1len < t2len) split_t1 = false;
            if (t2len < t1len) split_t2 = false;
 
-           // TODO -need to sort the uedges by longest edge length for this, 
if possible (probably
-           // should be doing that anyway...)  Want to get the longest edges 
first
-
-           // Mesh 1, triangle 1
+           // Mesh 1, triangle 1 longest edges
            if (split_t1) {
+               cdt_mesh::uedge_t sedge = tri_shortest_edge(omesh1->fmesh, 
t1.ind);
                std::set<cdt_mesh::uedge_t> uedges1 = omesh1->fmesh->uedges(t1);
                for (ue_it = uedges1.begin(); ue_it != uedges1.end(); ue_it++) {
-                   omesh1->split_edges.insert(*ue_it);
+                   if (*ue_it != sedge) {
+                       omesh1->split_edges.insert(*ue_it);
+                   }
                }
            }
-           // Mesh 2, triangle 2
+           // Mesh 2, triangle 2 longest edges
            if (split_t2) {
+               cdt_mesh::uedge_t sedge = tri_shortest_edge(omesh2->fmesh, 
t2.ind);
                std::set<cdt_mesh::uedge_t> uedges2 = omesh2->fmesh->uedges(t2);
                for (ue_it = uedges2.begin(); ue_it != uedges2.end(); ue_it++) {
-                   omesh2->split_edges.insert(*ue_it);
+                   if (*ue_it != sedge) {
+                       omesh2->split_edges.insert(*ue_it);
+                   }
                }
            }
        }
@@ -2586,44 +2621,44 @@
     while (face_ov_cnt) {
 
        iterations++;
-       if (iterations > 2) break;
+       if (iterations > 1) break;
 
-       // Make omesh containers for all the cdt_meshes in play
-       std::set<cdt_mesh::cdt_mesh_t *> afmeshes;
-       std::vector<omesh_t *> omeshes;
-       std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> f2omap;
-       for (p_it = check_pairs.begin(); p_it != check_pairs.end(); p_it++) {
-           afmeshes.insert(p_it->first);
-           afmeshes.insert(p_it->second);
-       }
-       std::set<cdt_mesh::cdt_mesh_t *>::iterator af_it;
-       for (af_it = afmeshes.begin(); af_it != afmeshes.end(); af_it++) {
-           cdt_mesh::cdt_mesh_t *fmesh = *af_it;
-           omeshes.push_back(new omesh_t(fmesh));
-           f2omap[fmesh] = omeshes[omeshes.size() - 1];
-       }
-       std::set<std::pair<omesh_t *, omesh_t *>> ocheck_pairs;
-       for (p_it = check_pairs.begin(); p_it != check_pairs.end(); p_it++) {
-           omesh_t *o1 = f2omap[p_it->first];
-           omesh_t *o2 = f2omap[p_it->second];
-           ocheck_pairs.insert(std::make_pair(o1, o2));
-       }
+    // Make omesh containers for all the cdt_meshes in play
+    std::set<cdt_mesh::cdt_mesh_t *> afmeshes;
+    std::vector<omesh_t *> omeshes;
+    std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> f2omap;
+    for (p_it = check_pairs.begin(); p_it != check_pairs.end(); p_it++) {
+       afmeshes.insert(p_it->first);
+       afmeshes.insert(p_it->second);
+    }
+    std::set<cdt_mesh::cdt_mesh_t *>::iterator af_it;
+    for (af_it = afmeshes.begin(); af_it != afmeshes.end(); af_it++) {
+       cdt_mesh::cdt_mesh_t *fmesh = *af_it;
+       omeshes.push_back(new omesh_t(fmesh));
+       f2omap[fmesh] = omeshes[omeshes.size() - 1];
+    }
+    std::set<std::pair<omesh_t *, omesh_t *>> ocheck_pairs;
+    for (p_it = check_pairs.begin(); p_it != check_pairs.end(); p_it++) {
+       omesh_t *o1 = f2omap[p_it->first];
+       omesh_t *o2 = f2omap[p_it->second];
+       ocheck_pairs.insert(std::make_pair(o1, o2));
+    }
+    face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
+
+    // The simplest operation is to find vertices close to each other with
+    // enough freedom of movement (per triangle edge length) that we can shift
+    // the two close neighbors to surface points that are both the respective
+    // closest points to a center point between the two originals.
+    int close_vert_checks = 1;
+    int avcnt = adjust_close_verts(ocheck_pairs);
+    if (avcnt) {
+       std::cout << close_vert_checks << ": Adjusted " << avcnt << " 
vertices\n";
+       check_faces_validity(check_pairs);
        face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
+       std::cout << "Post vert adjustment " << close_vert_checks << " overlap 
cnt: " << face_ov_cnt << "\n";
+       close_vert_checks++;
+    }
 
-       // The simplest operation is to find vertices close to each other with
-       // enough freedom of movement (per triangle edge length) that we can 
shift
-       // the two close neighbors to surface points that are both the 
respective
-       // closest points to a center point between the two originals.
-       int close_vert_checks = 1;
-       int avcnt = adjust_close_verts(ocheck_pairs);
-       if (avcnt) {
-           std::cout << close_vert_checks << ": Adjusted " << avcnt << " 
vertices\n";
-           check_faces_validity(check_pairs);
-           face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
-           std::cout << "Post vert adjustment " << close_vert_checks << " 
overlap cnt: " << face_ov_cnt << "\n";
-           close_vert_checks++;
-       }
-
        std::set<overt_t *> nverts;
 
        // Next up are Brep boundary edges, which have to be handled at a brep

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