Revision: 73915
http://sourceforge.net/p/brlcad/code/73915
Author: starseeker
Date: 2019-09-12 20:36:20 +0000 (Thu, 12 Sep 2019)
Log Message:
-----------
Stage logic for just yanking triangle with one bad edge. Not 100% sure about
this yet...
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt_mesh.cpp
brlcad/trunk/src/libbrep/cdt_mesh.h
Modified: brlcad/trunk/src/libbrep/cdt_mesh.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.cpp 2019-09-12 19:46:23 UTC (rev
73914)
+++ brlcad/trunk/src/libbrep/cdt_mesh.cpp 2019-09-12 20:36:20 UTC (rev
73915)
@@ -1930,6 +1930,38 @@
return false;
}
+// TODO If a triangle has only one bad edge, we need to figure out if we can
yank it...
+void
+cdt_mesh_t::remove_dangling_tris()
+{
+ if (boundary_edges_stale) {
+ boundary_edges_update();
+ }
+
+ if (!problem_edges.size()) return;
+
+ std::set<uedge_t>::iterator u_it;
+ std::set<triangle_t>::iterator t_it;
+ for (u_it = problem_edges.begin(); u_it != problem_edges.end(); u_it++) {
+ std::set<triangle_t> ptris = uedges2tris[(*u_it)];
+ for (t_it = uedges2tris[(*u_it)].begin(); t_it !=
uedges2tris[(*u_it)].end(); t_it++) {
+ triangle_t t = *t_it;
+ std::set<uedge_t> ue = t.uedges();
+ std::set<uedge_t>::iterator ue_it;
+ int bedge_cnt = 0;
+ for (ue_it = ue.begin(); ue_it != ue.end(); ue_it++) {
+ if (problem_edges.find(*ue_it) != problem_edges.end()) {
+ bedge_cnt++;
+ }
+ }
+
+ if (bedge_cnt == 1) {
+ tris.erase(t);
+ }
+ }
+ }
+}
+
std::vector<triangle_t>
cdt_mesh_t::problem_edge_tris()
{
@@ -1947,7 +1979,8 @@
for (u_it = problem_edges.begin(); u_it != problem_edges.end(); u_it++) {
std::set<triangle_t> ptris = uedges2tris[(*u_it)];
for (t_it = uedges2tris[(*u_it)].begin(); t_it !=
uedges2tris[(*u_it)].end(); t_it++) {
- uresults.insert(*t_it);
+ triangle_t t = *t_it;
+ uresults.insert(t);
}
}
@@ -2674,6 +2707,8 @@
return false;
}
+ //remove_dangling_tris();
+
// *Wrong* triangles: problem edge and/or flipped normal triangles. Handle
// those first, so the subsequent clean-up pass doesn't have to worry about
// errors they might introduce.
Modified: brlcad/trunk/src/libbrep/cdt_mesh.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.h 2019-09-12 19:46:23 UTC (rev 73914)
+++ brlcad/trunk/src/libbrep/cdt_mesh.h 2019-09-12 20:36:20 UTC (rev 73915)
@@ -173,6 +173,15 @@
v[0] = v[1] = v[2] = -1;
}
+ std::set<uedge_t> uedges()
+ {
+ std::set<uedge_t> ue;
+ ue.insert(uedge_t(v[0], v[1]));
+ ue.insert(uedge_t(v[1], v[2]));
+ ue.insert(uedge_t(v[2], v[0]));
+ return ue;
+ }
+
bool operator<(triangle_t other) const
{
std::vector<long> vca, voa;
@@ -535,6 +544,7 @@
// Submesh building
std::vector<triangle_t> singularity_triangles();
+ void remove_dangling_tris();
std::vector<triangle_t> problem_edge_tris();
bool tri_problem_edges(triangle_t &t);
std::vector<triangle_t> interior_incorrect_normals();
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