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