Revision: 74224
http://sourceforge.net/p/brlcad/code/74224
Author: starseeker
Date: 2019-10-23 18:04:01 +0000 (Wed, 23 Oct 2019)
Log Message:
-----------
Use an rtree to hold the refinement points
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt_ovlps.cpp
Modified: brlcad/trunk/src/libbrep/cdt_ovlps.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-10-23 17:43:43 UTC (rev
74223)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-10-23 18:04:01 UTC (rev
74224)
@@ -321,7 +321,12 @@
std::set<long> ovlping_tris;
- std::set<overt_t*> refinement_pnts;
+ std::map<overt_t *, long> refinement_overts_ids;
+ std::map<long, overt_t *> refinement_overts;
+ RTree<long, double, 3> refine_tree;
+ void refine_pnt_add(overt_t *);
+ void refine_pnt_remove(overt_t *);
+ void refine_pnts_clear();
std::set<cdt_mesh::uedge_t> split_edges;
@@ -545,11 +550,13 @@
}
pl_color(plot, 255, 0, 0);
- std::set<overt_t*>::iterator i_it;
- for (i_it = refinement_pnts.begin(); i_it != refinement_pnts.end();
i_it++) {
- overt_t *iv = *i_it;
+ RTree<long, double, 3>::Iterator rtree_it;
+ refine_tree.GetFirst(rtree_it);
+ while (!rtree_it.IsNull()) {
+ overt_t *iv = refinement_overts[*rtree_it];
ON_3dPoint vp = iv->vpnt();
plot_pnt_3d(plot, &vp, tri_r, 0);
+ ++rtree_it;
}
fclose(plot);
@@ -738,6 +745,55 @@
}
void
+omesh_t::refine_pnt_add(overt_t *v)
+{
+
+ size_t nind = 0;
+ if (refinement_overts.size()) {
+ nind = refinement_overts.rbegin()->first + 1;
+ }
+ refinement_overts[nind] = v;
+ refinement_overts_ids[v] = nind;
+
+ double fMin[3];
+ fMin[0] = v->bb.Min().x;
+ fMin[1] = v->bb.Min().y;
+ fMin[2] = v->bb.Min().z;
+ double fMax[3];
+ fMax[0] = v->bb.Max().x;
+ fMax[1] = v->bb.Max().y;
+ fMax[2] = v->bb.Max().z;
+ refine_tree.Insert(fMin, fMax, nind);
+}
+
+void
+omesh_t::refine_pnt_remove(overt_t *v)
+{
+ if (refinement_overts_ids.find(v) == refinement_overts_ids.end()) return;
+ size_t nind = refinement_overts_ids[v];
+ refinement_overts.erase(nind);
+ refinement_overts_ids.erase(v);
+
+ double fMin[3];
+ fMin[0] = v->bb.Min().x-ON_ZERO_TOLERANCE;
+ fMin[1] = v->bb.Min().y-ON_ZERO_TOLERANCE;
+ fMin[2] = v->bb.Min().z-ON_ZERO_TOLERANCE;
+ double fMax[3];
+ fMax[0] = v->bb.Max().x+ON_ZERO_TOLERANCE;
+ fMax[1] = v->bb.Max().y+ON_ZERO_TOLERANCE;
+ fMax[2] = v->bb.Max().z+ON_ZERO_TOLERANCE;
+ refine_tree.Remove(fMin, fMax, nind);
+}
+
+void
+omesh_t::refine_pnts_clear()
+{
+ refinement_overts.clear();
+ refinement_overts_ids.clear();
+ refine_tree.RemoveAll();
+}
+
+void
omesh_t::edge_add(cdt_mesh::uedge_t &ue, int update_verts)
{
if (interior_uedge_ids.find(ue) != interior_uedge_ids.end()) {
@@ -2277,7 +2333,7 @@
tri_isect_cnt++;
}
if (tri_isect_cnt > 1) {
- omesh1->refinement_pnts.insert(v);
+ omesh1->refine_pnt_add(v);
have_refinement_pnt = true;
break;
}
@@ -2347,8 +2403,8 @@
// If we need to refine (i.e. change the mesh) we're going to have to
go through
// the interior identification process again.
for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
- cp_it->first->refinement_pnts.clear();
- cp_it->second->refinement_pnts.clear();
+ cp_it->first->refine_pnts_clear();
+ cp_it->second->refine_pnts_clear();
}
}
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