Revision: 74185
          http://sourceforge.net/p/brlcad/code/74185
Author:   starseeker
Date:     2019-10-19 17:44:38 +0000 (Sat, 19 Oct 2019)
Log Message:
-----------
Initial stab at interior mesh edge tree (untested).

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 16:12:29 UTC (rev 
74184)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp      2019-10-19 17:44:38 UTC (rev 
74185)
@@ -241,7 +241,6 @@
 
        // We don't remove vertices during overlap resolution - just add and
        // update them - so a vector works as a container.
-       cdt_mesh::cdt_mesh_t *fmesh;
        std::vector<class overt_t> overts;
        RTree<size_t, double, 3> vtree;
 
@@ -278,6 +277,7 @@
 
        void retessellate(std::set<size_t> &ov);
 
+       cdt_mesh::cdt_mesh_t *fmesh;
     private:
        void verts_one_ring_update(long p_ind);
        void init_verts();
@@ -352,7 +352,96 @@
     }
 }
 
+void
+omesh_t::init_edges()
+{
+    // Walk the fmesh's rtree holding the active triangles to get all
+    // edges
+    std::set<cdt_mesh::uedge_t> uedges;
+    RTree<size_t, double, 3>::Iterator tree_it;
+    size_t t_ind;
+    cdt_mesh::triangle_t tri;
+    fmesh->tris_tree.GetFirst(tree_it);
+    while (!tree_it.IsNull()) {
+       t_ind = *tree_it;
+       tri = fmesh->tris_vect[t_ind];
+       uedges.insert(cdt_mesh::uedge_t(tri.v[0], tri.v[1]));
+       uedges.insert(cdt_mesh::uedge_t(tri.v[1], tri.v[2]));
+       uedges.insert(cdt_mesh::uedge_t(tri.v[2], tri.v[0]));
+       ++tree_it;
+    }
+    std::set<cdt_mesh::uedge_t>::iterator u_it;
+    bool first_edge = true;
+    for (u_it = uedges.begin(); u_it != uedges.end(); u_it++) {
+       if (fmesh->brep_edges.find(*u_it) != fmesh->brep_edges.end()) {
+           continue;
+       }
+       size_t nind = 0;
+       if (!first_edge) {
+           nind = interior_uedges.rbegin()->first + 1;
+       } else {
+           first_edge = false;
+       }
+       interior_uedges[nind] = *u_it;
+       interior_uedge_ids[*u_it] = nind;
+       ON_3dPoint *p3d1 = fmesh->pnts[(*u_it).v[0]];
+       ON_3dPoint *p3d2 = fmesh->pnts[(*u_it).v[1]];
+       ON_Line l(*p3d1, *p3d2);
+       ON_BoundingBox ebb = l.BoundingBox();
+       double dist = 0.5*l.Length();
+       double xdist = ebb.m_max.x - ebb.m_min.x;
+       double ydist = ebb.m_max.y - ebb.m_min.y;
+       double zdist = ebb.m_max.z - ebb.m_min.z;
+       if (xdist < dist) {
+           ebb.m_min.x = ebb.m_min.x - 0.5*dist;
+           ebb.m_max.x = ebb.m_max.x + 0.5*dist;
+       }
+       if (ydist < dist) {
+           ebb.m_min.y = ebb.m_min.y - 0.5*dist;
+           ebb.m_max.y = ebb.m_max.y + 0.5*dist;
+       }
+       if (zdist < dist) {
+           ebb.m_min.z = ebb.m_min.z - 0.5*dist;
+           ebb.m_max.z = ebb.m_max.z + 0.5*dist;
+       }
+       double fMin[3];
+       fMin[0] = ebb.Min().x;
+       fMin[1] = ebb.Min().y;
+       fMin[2] = ebb.Min().z;
+       double fMax[3];
+       fMax[0] = ebb.Max().x;
+       fMax[1] = ebb.Max().y;
+       fMax[2] = ebb.Max().z;
+       iuetree.Insert(fMin, fMax, nind);
+    }
+}
 
+static bool NearBoundaryEdgesCallback(void *data, void *a_context) {
+    std::set<cdt_mesh::cpolyedge_t *> *edges = (std::set<cdt_mesh::cpolyedge_t 
*> *)a_context;
+    cdt_mesh::cpolyedge_t *pe  = (cdt_mesh::cpolyedge_t *)data;
+    edges->insert(pe);
+    return true;
+}
+std::set<cdt_mesh::cpolyedge_t *>
+omesh_t::boundary_edges_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<cdt_mesh::cpolyedge_t *> nedges;
+    struct ON_Brep_CDT_State *s_cdt = (struct ON_Brep_CDT_State *)fmesh->p_cdt;
+    size_t nhits = s_cdt->face_rtrees_3d[fmesh->f_id].Search(fMin, fMax, 
NearBoundaryEdgesCallback, (void *)&nedges);
+
+    if (!nhits) {
+       return std::set<cdt_mesh::cpolyedge_t *>();
+    }
+    return nedges;
+}
+
 static bool NearIntEdgesCallback(size_t data, void *a_context) {
     std::set<size_t> *edges = (std::set<size_t> *)a_context;
     edges->insert(data);
@@ -375,6 +464,7 @@
        // 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 std::set<size_t>();
     }
 
     return nedges;
@@ -1581,8 +1671,6 @@
     return replaced_tris;
 }
 
-
-
 static bool NearEdgesCallback(void *data, void *a_context) {
     std::set<cdt_mesh::cpolyedge_t *> *edges = (std::set<cdt_mesh::cpolyedge_t 
*> *)a_context;
     cdt_mesh::cpolyedge_t *pe  = (cdt_mesh::cpolyedge_t *)data;

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