Revision: 74184
http://sourceforge.net/p/brlcad/code/74184
Author: starseeker
Date: 2019-10-19 16:12:29 +0000 (Sat, 19 Oct 2019)
Log Message:
-----------
Start working in initial implementations of lowest level operations for omesh
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-19 15:34:24 UTC (rev
74183)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-10-19 16:12:29 UTC (rev
74184)
@@ -218,7 +218,8 @@
omesh_t *omesh;
long p_id;
- double mlen();
+ double min_len();
+ double max_len();
ON_BoundingBox bb;
size_t closest_uedge;
@@ -263,9 +264,16 @@
// containers.
void vert_add(ON_3dPoint *p, ON_3dVector *v);
+ // Find close vertices
std::set<size_t> overts_search(ON_BoundingBox &bb);
+
+ // Find close face boundary edges
std::set<cdt_mesh::cpolyedge_t *> boundary_edges_search(ON_BoundingBox
&bb);
+
+ // Find close (non-face-boundary) edges
std::set<size_t> interior_uedges_search(ON_BoundingBox &bb);
+
+ // Find close triangles
std::set<size_t> tris_search(ON_BoundingBox &bb);
void retessellate(std::set<size_t> &ov);
@@ -282,10 +290,98 @@
void add_tri(cdt_mesh::triangle_t &t);
};
+double
+overt_t::min_len() {
+ return v_min_edge_len;
+}
+void
+overt_t::update() {
+ // 1. Get pnt's associated edges.
+ std::set<cdt_mesh::edge_t> edges = omesh->fmesh->v2edges[p_id];
+ // 2. find the shortest edge associated with pnt
+ std::set<cdt_mesh::edge_t>::iterator e_it;
+ double elen = DBL_MAX;
+ for (e_it = edges.begin(); e_it != edges.end(); e_it++) {
+ ON_3dPoint *p1 = omesh->fmesh->pnts[(*e_it).v[0]];
+ ON_3dPoint *p2 = omesh->fmesh->pnts[(*e_it).v[1]];
+ double dist = p1->DistanceTo(*p2);
+ elen = (dist < elen) ? dist : elen;
+ }
+ v_min_edge_len = elen;
+ // create a bbox around pnt using length ~20% of the shortest edge length.
+ ON_3dPoint vpnt = *omesh->fmesh->pnts[p_id];
+ ON_BoundingBox init_bb(vpnt, vpnt);
+ bb = init_bb;
+ ON_3dPoint npnt = vpnt;
+ double lfactor = 0.2;
+ npnt.x = npnt.x + lfactor*elen;
+ bb.Set(npnt, true);
+ npnt = vpnt;
+ npnt.x = npnt.x - lfactor*elen;
+ bb.Set(npnt, true);
+ npnt = vpnt;
+ npnt.y = npnt.y + lfactor*elen;
+ bb.Set(npnt, true);
+ npnt = vpnt;
+ npnt.y = npnt.y - lfactor*elen;
+ bb.Set(npnt, true);
+ npnt = vpnt;
+ npnt.z = npnt.z + lfactor*elen;
+ bb.Set(npnt, true);
+ npnt = vpnt;
+ npnt.z = npnt.z - lfactor*elen;
+ bb.Set(npnt, true);
+ double mindist = DBL_MAX;
+ closest_uedge = -1;
+ std::set<size_t> close_edges = omesh->interior_uedges_search(bb);
+ std::set<size_t>::iterator c_it;
+ for (c_it = close_edges.begin(); c_it != close_edges.end(); c_it++) {
+ cdt_mesh::uedge_t ue = omesh->interior_uedges[*c_it];
+ ON_3dPoint *p3d1 = omesh->fmesh->pnts[ue.v[0]];
+ ON_3dPoint *p3d2 = omesh->fmesh->pnts[ue.v[1]];
+ ON_Line line(*p3d1, *p3d2);
+ double dline = vpnt.DistanceTo(line.ClosestPointTo(vpnt));
+ if (mindist > dline) {
+ closest_uedge = *c_it;
+ mindist = dline;
+ }
+ }
+}
+
+
+static bool NearIntEdgesCallback(size_t data, void *a_context) {
+ std::set<size_t> *edges = (std::set<size_t> *)a_context;
+ edges->insert(data);
+ return true;
+}
+std::set<size_t>
+omesh_t::interior_uedges_search(ON_BoundingBox &bb)
+{
+ double fMin[3]; double fMax[3];
+ fMin[0] = bb.Min().x;
+ fMin[1] = bb.Min().y;
+ fMin[2] = bb.Min().z;
+ fMax[0] = bb.Max().x;
+ fMax[1] = bb.Max().y;
+ fMax[2] = bb.Max().z;
+ std::set<size_t> nedges;
+ size_t nhits = iuetree.Search(fMin, fMax, NearIntEdgesCallback, (void
*)&nedges);
+
+ if (!nhits) {
+ // TODO - if we've got nothing, try triangles - if we're close to any
of those,
+ // iterate through them and find the closest edge
+ std::cout << "not real close to edge...\n";
+ }
+
+ return nedges;
+}
+
+
+
#define TREE_LEAF_FACE_3D(pf, valp, a, b, c, d) \
pdv_3move(pf, pt[a]); \
pdv_3cont(pf, pt[b]); \
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