Revision: 74225
http://sourceforge.net/p/brlcad/code/74225
Author: starseeker
Date: 2019-10-23 18:51:33 +0000 (Wed, 23 Oct 2019)
Log Message:
-----------
Remove unused code, clear split_edges after we're done with a pass.
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 18:04:01 UTC (rev
74224)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-10-23 18:51:33 UTC (rev
74225)
@@ -1359,194 +1359,8 @@
return polygon.point_in_polygon(polygon.pnts_2d.size() - 1, false);
}
-
-// Characterize the point position relative to the triangles'
-// structure as follows:
-/*
- *
- * /\
- * /33\
- * /3333\
- * / 3333 \
- * / 33 \
- * / /\ \
- * / / \ \
- * / / \ \
- * 0 / / \ \ 0
- * / 2 / \ 2 \
- * / / \ \
- * / / \ \
- * / / 1 \ \
- * / / \ \
- * / / \ \
- * /333 / \ 333\
- * /33333______________________33333\
- * /33333 2 33333\
- * --------------------------------------
- *
- * 0
- *
- * If a type 2 point is also near a brep face edge, it is
- * elevated to type 4.
- */
-// For the moment, we're defining the distance away
-// from the vert and edge structures as .1 * the
-// shortest triangle edge.
-int
-characterize_avgpnt(
- cdt_mesh::triangle_t &t,
- cdt_mesh::cdt_mesh_t *fmesh,
- ON_3dPoint &sp,
- double *dist
- )
-{
- double t_se = tri_shortest_edge_len(fmesh, t.ind);
-
- // Figure out how far away the triangle is from the point in question
- point_t tp, v0, v1, v2;
- VSET(tp, sp.x, sp.y, sp.z);
- VSET(v0, fmesh->pnts[t.v[0]]->x, fmesh->pnts[t.v[0]]->y,
fmesh->pnts[t.v[0]]->z);
- VSET(v1, fmesh->pnts[t.v[1]]->x, fmesh->pnts[t.v[1]]->y,
fmesh->pnts[t.v[1]]->z);
- VSET(v2, fmesh->pnts[t.v[2]]->x, fmesh->pnts[t.v[2]]->y,
fmesh->pnts[t.v[2]]->z);
- (*dist) = bg_tri_pt_dist(tp, v0, v1, v2);
-
- // Make sure the point projects inside the triangle - if it doesn't
- // it's a category 0 point
- bool t_projects = projects_inside_tri(fmesh, t, sp);
-
- if (!t_projects) {
- return 0;
- }
-
- ON_3dPoint t_pnts[3];
- ON_Line t_edges[3];
- for (int i = 0; i < 3; i++) {
- t_pnts[i] = *fmesh->pnts[t.v[i]];
- }
- for (int i = 0; i < 3; i++) {
- int j = (i < 2) ? i+1 : 0;
- t_edges[i] = ON_Line(t_pnts[i], t_pnts[j]);
- }
-
- double t_dpnts[3] = {DBL_MAX, DBL_MAX, DBL_MAX};
- double t_dedges[3] = {DBL_MAX, DBL_MAX, DBL_MAX};
-
- for (int i = 0; i < 3; i++) {
- t_dpnts[i] = t_pnts[i].DistanceTo(sp);
- t_dedges[i] = sp.DistanceTo(t_edges[i].ClosestPointTo(sp));
- }
-
- double t_dpmin = DBL_MAX;
- double t_demin = DBL_MAX;
-
- for (int i = 0; i < 3; i++) {
- t_dpmin = (t_dpnts[i] < t_dpmin) ? t_dpnts[i] : t_dpmin;
- t_demin = (t_dedges[i] < t_demin) ? t_dedges[i] : t_demin;
- }
-
- bool t_close_to_vert = (t_dpmin < 0.1 * t_se);
- bool t_close_to_edge = (t_demin < 0.1 * t_se);
-
- bool t_close_to_face_edge = false;
- if (t_close_to_edge) {
- for (int i = 0; i < 3; i++) {
- if (NEAR_EQUAL(t_dedges[i], t_demin, ON_ZERO_TOLERANCE)) {;
- int j = (i < 2) ? i+1 : 0;
- struct cdt_mesh::uedge_t ue(t.v[i], t.v[j]);
- if (fmesh->brep_edges.find(ue) != fmesh->brep_edges.end()) {
- t_close_to_face_edge = true;
- break;
- }
- }
- }
- }
-
- int rtype = 0;
-
- if (t_close_to_vert) {
- rtype = 3;
- }
- if (!t_close_to_vert && t_close_to_edge) {
- rtype = 2;
- }
- if (!t_close_to_vert && !t_close_to_edge) {
- rtype = 1;
- }
-
- if (rtype == 2 && t_close_to_face_edge) {
- rtype = 4;
- }
-
- return rtype;
-}
-
-/******************************************************************************
- * For nearby vertices that meet certain criteria, we can adjust the vertices
- * to instead use closest points from the various surfaces and eliminate
- * what would otherwise be rather thorny triangle intersection cases.
-
******************************************************************************/
-struct mvert_info {
- struct ON_Brep_CDT_State *s_cdt;
- int f_id;
- long p_id;
- ON_BoundingBox bb;
- double e_minlen;
- std::map<long, struct mvert_info *> *map;
-};
-
-void
-mvert_update_edge_minlen(struct mvert_info *v)
-{
- struct ON_Brep_CDT_State *s_cdt = v->s_cdt;
- cdt_mesh::cdt_mesh_t &fmesh = s_cdt->fmeshes[v->f_id];
-
- // 1. Get pnt's associated edges.
- std::set<cdt_mesh::edge_t> edges = fmesh.v2edges[v->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 = fmesh.pnts[(*e_it).v[0]];
- ON_3dPoint *p2 = fmesh.pnts[(*e_it).v[1]];
- double dist = p1->DistanceTo(*p2);
- elen = (dist < elen) ? dist : elen;
- }
- v->e_minlen = elen;
- //std::cout << "Min edge len: " << elen << "\n";
-}
-
-void
-mvert_update_all_edge_minlens(struct mvert_info *v)
-{
- struct ON_Brep_CDT_State *s_cdt = v->s_cdt;
- cdt_mesh::cdt_mesh_t &fmesh = s_cdt->fmeshes[v->f_id];
-
- std::set<long> verts;
-
- // 1. Get pnt's associated edges.
- std::set<cdt_mesh::edge_t> edges = fmesh.v2edges[v->p_id];
-
- // 2. Collect all the vertices associated with all the edges
- // connected to the original point - these are the mvert_info
- // structures that may have a new minimum edge length after
- // the change.
- std::set<cdt_mesh::edge_t>::iterator e_it;
- for (e_it = edges.begin(); e_it != edges.end(); e_it++) {
- verts.insert((*e_it).v[0]);
- verts.insert((*e_it).v[1]);
- }
-
- // 3. Update each mvert_info minimum edge length
- std::set<long>::iterator v_it;
- for (v_it = verts.begin(); v_it != verts.end(); v_it++) {
- struct mvert_info *vu = (*v->map)[*v_it];
- mvert_update_edge_minlen(vu);
- }
-}
-
overt_t *
-get_largest_mvert(std::set<overt_t *> &verts)
+get_largest_overt(std::set<overt_t *> &verts)
{
double elen = 0;
overt_t *l = NULL;
@@ -1562,7 +1376,7 @@
}
overt_t *
-closest_mvert(std::set<overt_t *> &verts, overt_t *v)
+closest_overt(std::set<overt_t *> &verts, overt_t *v)
{
overt_t *closest = NULL;
double dist = DBL_MAX;
@@ -1580,7 +1394,8 @@
return closest;
}
-// TODO - need to be aware when one of the mvert vertices is on
+
+// TODO - need to be aware when one of the vertices is on
// a brep face edge. In that situation it has much less freedom
// to move, so we need to try and adjust the other point more
// aggressively. If they're both edge points we can try this,
@@ -1637,100 +1452,6 @@
}
}
-// Get the bounding boxes of all vertices of all meshes of all breps in the
-// pairs sets that might have possible interactions
-void
-vert_bboxes(
- std::vector<struct mvert_info *> *all_mverts,
- std::map<std::pair<struct ON_Brep_CDT_State *, int>, RTree<void *,
double, 3>> *rtrees_mpnts,
- std::map<std::pair<struct ON_Brep_CDT_State *, int>, std::map<long,
struct mvert_info *>> *mpnt_maps,
- std::set<std::pair<cdt_mesh::cdt_mesh_t *, cdt_mesh::cdt_mesh_t *>>
&check_pairs)
-{
- // Get the bounding boxes of all vertices of all meshes of all breps in
- // s_a that might have possible interactions, and find close point sets
- std::set<cdt_mesh::cdt_mesh_t *> fmeshes;
- std::set<std::pair<cdt_mesh::cdt_mesh_t *, cdt_mesh::cdt_mesh_t
*>>::iterator cp_it;
- for (cp_it = check_pairs.begin(); cp_it != check_pairs.end(); cp_it++) {
- cdt_mesh::cdt_mesh_t *fmesh1 = cp_it->first;
- cdt_mesh::cdt_mesh_t *fmesh2 = cp_it->second;
- fmeshes.insert(fmesh1);
- fmeshes.insert(fmesh2);
- }
- std::set<cdt_mesh::cdt_mesh_t *>::iterator f_it;
- for (f_it = fmeshes.begin(); f_it != fmeshes.end(); f_it++) {
- cdt_mesh::cdt_mesh_t *fmesh = *f_it;
- struct ON_Brep_CDT_State *s_cdt = (struct ON_Brep_CDT_State
*)fmesh->p_cdt;
-
- // Walk the fmesh's rtree holding the active triangles to get all
- // vertices active in the face
- std::set<long> averts;
- 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];
- averts.insert(tri.v[0]);
- averts.insert(tri.v[1]);
- averts.insert(tri.v[2]);
- ++tree_it;
- }
-
- std::vector<struct mvert_info *> mverts;
- std::set<long>::iterator a_it;
- for (a_it = averts.begin(); a_it != averts.end(); a_it++) {
- // 0. Initialize mvert object.
- struct mvert_info *mvert = new struct mvert_info;
- mvert->s_cdt = s_cdt;
- mvert->f_id = fmesh->f_id;
- mvert->p_id = *a_it;
- mvert->map = &((*mpnt_maps)[std::make_pair(s_cdt,fmesh->f_id)]);
- mvert_update_edge_minlen(mvert);
- // 1. create a bbox around pnt using length ~20% of the shortest
edge length.
- ON_3dPoint vpnt = *fmesh->pnts[(*a_it)];
- ON_BoundingBox bb(vpnt, vpnt);
- ON_3dPoint npnt;
- npnt = vpnt;
- double lfactor = 0.2;
- double elen = mvert->e_minlen;
- 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);
- mvert->bb = bb;
- // 2. insert result into mverts;
- mverts.push_back(mvert);
- }
- for (size_t i = 0; i < mverts.size(); i++) {
- double fMin[3];
- fMin[0] = mverts[i]->bb.Min().x;
- fMin[1] = mverts[i]->bb.Min().y;
- fMin[2] = mverts[i]->bb.Min().z;
- double fMax[3];
- fMax[0] = mverts[i]->bb.Max().x;
- fMax[1] = mverts[i]->bb.Max().y;
- fMax[2] = mverts[i]->bb.Max().z;
- (*rtrees_mpnts)[std::make_pair(s_cdt,fmesh->f_id)].Insert(fMin,
fMax, (void *)mverts[i]);
- (*mverts[i]->map)[mverts[i]->p_id] = mverts[i];
- }
- all_mverts->insert(all_mverts->end(), mverts.begin(), mverts.end());
- }
-}
-
size_t
adjust_close_verts(std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs)
{
@@ -1749,6 +1470,9 @@
omesh2->plot_vtree(bu_vls_cstr(&fname));
bu_vls_free(&fname);
std::set<std::pair<long, long>> vert_pairs;
+ std::cout << "omesh1 vtree cnt: " << omesh1->vtree.Count() << "\n";
+ std::cout << "omesh2 vtree cnt: " << omesh2->vtree.Count() << "\n";
+ vert_pairs.clear();
omesh1->vtree.Overlaps(omesh2->vtree, &vert_pairs);
std::cout << "(" << s_cdt1->name << "," << omesh1->fmesh->f_id << ")+("
<< s_cdt2->name << "," << omesh2->fmesh->f_id << "): " << vert_pairs.size() <<
" vert box overlaps\n";
std::set<std::pair<long, long>>::iterator v_it;
@@ -1799,8 +1523,8 @@
// If the box structure is more complicated, we need to be a bit selective
while (vq_multi.size()) {
- overt_t *l = get_largest_mvert(vq_multi);
- overt_t *c = closest_mvert(vert_ovlps[l], l);
+ overt_t *l = get_largest_overt(vq_multi);
+ overt_t *c = closest_overt(vert_ovlps[l], l);
vq_multi.erase(l);
vq_multi.erase(c);
vert_ovlps[l].erase(c);
@@ -1825,7 +1549,7 @@
t.v[2] = t.v[1];
t.v[1] = tmp;
}
-}
+}
void
replace_edge_split_tri(cdt_mesh::cdt_mesh_t &fmesh, size_t t_id, long np_id,
@@ -2240,7 +1964,7 @@
return bedge_split_near_vert(edge_vert, f2omap);
}
-
+#if 0
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;
@@ -2247,6 +1971,7 @@
edges->insert(pe);
return true;
}
+#endif
void
check_faces_validity(std::set<std::pair<cdt_mesh::cdt_mesh_t *,
cdt_mesh::cdt_mesh_t *>> &check_pairs, int UNUSED(id))
@@ -2271,37 +1996,6 @@
}
}
-struct p_mvert_info {
- struct ON_Brep_CDT_State *s_cdt;
- int f_id;
- ON_3dPoint p;
- ON_3dVector n;
- ON_BoundingBox bb;
- bool edge_split_only;
- bool deactivate;
-};
-
-void plot_mvert_set(double r, std::set<struct p_mvert_info *> &pv)
-{
- FILE *plot = fopen("mvert.plot3", "w");
- pl_color(plot, 255, 0, 0);
- std::set<struct p_mvert_info *>::iterator pm_it;
- for (pm_it = pv.begin(); pm_it != pv.end(); pm_it++) {
- plot_pnt_3d(plot, &((*pm_it)->p), r, 0);
- }
- fclose(plot);
-}
-
-#if 0
-static bool NearVertsCallback(void *data, void *a_context) {
- std::set<long> *cpnts = (std::set<long> *)a_context;
- struct mvert_info *mv = (struct mvert_info *)data;
- cpnts->insert(mv->p_id);
- return true;
-}
-#endif
-
-
// Using triangle planes and then an inside/outside test, determine
// which point(s) from the opposite triangle are "inside" the
// meshes. Each of these points is an "overlap instance" that the
@@ -2380,10 +2074,8 @@
if (!have_interior_pnt) {
std::cout << "PROBLEM - intersecting triangles but no vertex
points are refinement candidates!\n";
- // Strategy here - queue up all the unordered edges on both
triangles in their
+ // Strategy here - queue up longest unordered edge on each
triangle in their
// respective omeshes for midpoint splitting.
- //
- // TODO - may want to do just the longest edge, rather than all
three...
{
// Mesh 1, triangle 1
cdt_mesh::uedge_t ue = tri_longest_edge(omesh1->fmesh,
t1.ind);
@@ -2476,10 +2168,15 @@
long f3ind = omesh->fmesh->add_point(new ON_3dPoint(spnt));
long fnind = omesh->fmesh->add_normal(new ON_3dPoint(sn));
struct ON_Brep_CDT_State *s_cdt = (struct ON_Brep_CDT_State
*)omesh->fmesh->p_cdt;
+ //std::cout << s_cdt->name << " face " << omesh->fmesh->f_id << "
validity: " << omesh->fmesh->valid(1) << "\n";
CDT_Add3DPnt(s_cdt, omesh->fmesh->pnts[f3ind], omesh->fmesh->f_id,
-1, -1, -1, 0, 0);
CDT_Add3DNorm(s_cdt, omesh->fmesh->normals[fnind],
omesh->fmesh->pnts[f3ind], omesh->fmesh->f_id, -1, -1, -1, 0, 0);
omesh->fmesh->nmap[f3ind] = fnind;
std::set<size_t> rtris = omesh->fmesh->uedges2tris[ue];
+ if (!rtris.size()) {
+ std::cout << "ERROR! no triangles associated with edge!\n";
+ continue;
+ }
std::set<size_t>::iterator r_it;
for (r_it = rtris.begin(); r_it != rtris.end(); r_it++) {
replace_edge_split_tri(*omesh->fmesh, *r_it, f3ind, ue, f2omap);
@@ -2486,6 +2183,7 @@
}
omesh->vert_add(f3ind);
}
+ omesh->split_edges.clear();
}
}
@@ -2573,199 +2271,7 @@
}
#endif
-void
-process_near_edge_pnts(std::map<cdt_mesh::cdt_mesh_t *, std::set<struct
p_mvert_info *>> *face_npnts,
- std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap)
-{
- std::map<cdt_mesh::bedge_seg_t *, std::set<struct p_mvert_info *>> esplits;
- std::map<cdt_mesh::cdt_mesh_t *, std::set<struct p_mvert_info
*>>::iterator f_it;
- for (f_it = face_npnts->begin(); f_it != face_npnts->end(); f_it++) {
- cdt_mesh::cdt_mesh_t *fmesh = f_it->first;
- struct ON_Brep_CDT_State *s_cdt = (struct ON_Brep_CDT_State
*)fmesh->p_cdt;
- std::set<struct p_mvert_info *>::iterator pm_it;
- std::map<cdt_mesh::cpolyedge_t *, struct p_mvert_info *> to_split;
- for (pm_it = f_it->second.begin(); pm_it != f_it->second.end();
pm_it++) {
- struct p_mvert_info *pmv = *pm_it;
- // If this point is already off there's no point in looking again
- if (pmv->deactivate) continue;
- double fMin[3]; double fMax[3];
- fMin[0] = pmv->bb.Min().x;
- fMin[1] = pmv->bb.Min().y;
- fMin[2] = pmv->bb.Min().z;
- fMax[0] = pmv->bb.Max().x;
- fMax[1] = pmv->bb.Max().y;
- fMax[2] = pmv->bb.Max().z;
- std::set<cdt_mesh::cpolyedge_t *> nedges;
- size_t nhits = s_cdt->face_rtrees_3d[fmesh->f_id].Search(fMin,
fMax, NearEdgesCallback, (void *)&nedges);
-
- if (nhits) {
- std::set<cdt_mesh::cpolyedge_t *>::iterator n_it;
- cdt_mesh::bedge_seg_t *closest_edge = NULL;
- double closest_dist = DBL_MAX;
- for (n_it = nedges.begin(); n_it != nedges.end(); n_it++) {
- cdt_mesh::bedge_seg_t *eseg = (*n_it)->eseg;
- double lseg_dist = eseg->e_start->DistanceTo(*eseg->e_end);
- ON_NurbsCurve *nc = eseg->nc;
- ON_Interval domain(eseg->edge_start, eseg->edge_end);
- double t;
- ON_NurbsCurve_GetClosestPoint(&t, nc, pmv->p, 0.0, &domain);
- ON_3dPoint cep = nc->PointAt(t);
- double ecdist = cep.DistanceTo(pmv->p);
- double epdist1 = eseg->e_start->DistanceTo(cep);
- double epdist2 = eseg->e_end->DistanceTo(cep);
- double lseg_check = 0.05 * lseg_dist;
- FILE *plot_file = NULL;
- if (epdist1 > lseg_check && epdist2 > lseg_check) {
- // If the point is not close to a start/end point on
the edge then split the edge.
- // Check closest point to edge for each segment. If
- // closest edge point is close to the edge per the line
- // segment length, we need to split the edge curve to
keep
- // its approximating polyline as far as possible from
the
- // new point.
-
- if (ecdist < 0.2*lseg_dist) {
- double etol =
s_cdt->brep->m_E[eseg->edge_ind].m_tolerance;
- etol = (etol > 0) ? etol : ON_ZERO_TOLERANCE;
- //std::cout << "etol,closest_dist,ecdist,lseg_dist:
" << etol << "," << closest_dist << "," << ecdist << "," << lseg_dist << "\n";
-
- if (closest_dist > ecdist) {
- closest_dist = ecdist;
- closest_edge = eseg;
- // TODO - probably should base this on what
kind of triangle would
- // get created if we don't settle for only
splitting the edge, if that's
- // practical...
- //
- // Alternately (and maybe better), can we adjust
- // the intruding vertex to use the point that
will
- // come from the split?
- if (ecdist <= etol || ecdist < 0.02*lseg_dist) {
- // If the point is actually ON the edge (to
- // within ON_ZERO_TOLERANCE or the brep
edge's
- // tolerance) we'll be introducing a new
point
- // on the edge AT that point, and no
additional
- // work is needed on that point. If that's
the
- // case set the flag, otherwise, the point
- // stays "live" and feeds into the next
step.
- pmv->edge_split_only = true;
- //std::cout << "edge split only\n";
- //plot_file =
fopen("edge_mvert_eonly.plot3", "w");
- } else {
- //plot_file = fopen("edge_mvert.plot3",
"w");
- }
-
- }
- }
- } else {
- //std::cout << "too close to existing edge point...\n";
#if 0
- std::cout << "closest_dist,ecdist,lseg_dist: " <<
closest_dist << "," << ecdist << "," << lseg_dist << "\n";
- std::cout << "d1: " << epdist1 << ", d2: " << epdist2
<< ", lseg_check: " << lseg_check << "\n";
-#endif
- pmv->deactivate = true;
- //plot_file = fopen("edge_mvert_deactivate.plot3", "w");
- }
-
- if (plot_file) {
-#if 1
- pl_color(plot_file, 0, 0, 255);
- point_t bnp1, bnp2;
- VSET(bnp1, eseg->e_start->x, eseg->e_start->y,
eseg->e_start->z);
- VSET(bnp2, eseg->e_end->x, eseg->e_end->y,
eseg->e_end->z);
- pdv_3move(plot_file, bnp1);
- pdv_3cont(plot_file, bnp2);
- pl_color(plot_file, 255, 0, 0);
- plot_pnt_3d(plot_file, &cep, 0.03*lseg_dist, 0);
- pl_color(plot_file, 0, 255, 0);
- plot_pnt_3d(plot_file, &pmv->p, 0.03*lseg_dist, 0);
-#endif
- fclose(plot_file);
- }
-
- }
- if (closest_edge) {
- esplits[closest_edge].insert(pmv);
- }
- }
- }
- }
-
- std::set<cdt_mesh::bedge_seg_t *> split_segs;
-
- std::map<cdt_mesh::bedge_seg_t *, std::set<struct p_mvert_info
*>>::iterator es_it;
- for (es_it = esplits.begin(); es_it != esplits.end(); es_it++) {
- std::set<cdt_mesh::bedge_seg_t *> asegs;
- asegs.insert(es_it->first);
- if (split_segs.find(es_it->first) != split_segs.end()) {
- std::cout << "ERROR - splitting on stale seg!\n";
- }
- // If we have multiple p_mvert points associated with this edge, we'll
need
- // multiple splits on that edge - or, more precisely, we'll need to
identify
- // the closest of the new edges that replaced the original after the
first split
- // and split that one.
- //
- // We initialize the active segments set with the initial segment, and
then
- // maintain the set with all unsplit segments that have replaced the
original
- // edge segment or one of its replacements.
- std::set<struct p_mvert_info *>::iterator pm_it;
- for (pm_it = es_it->second.begin(); pm_it != es_it->second.end();
pm_it++) {
- struct p_mvert_info *pmv = *pm_it;
- if (pmv->deactivate) continue;
- cdt_mesh::bedge_seg_t *closest_edge = NULL;
- double split_t = -1.0;
- double closest_dist = DBL_MAX;
- std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
- std::cout << "asegs size: " << asegs.size() << "\n";
- for (e_it = asegs.begin(); e_it != asegs.end(); e_it++) {
- cdt_mesh::bedge_seg_t *eseg = *e_it;
- ON_NurbsCurve *nc = eseg->nc;
- ON_Interval domain(eseg->edge_start, eseg->edge_end);
- double t;
- ON_NurbsCurve_GetClosestPoint(&t, nc, pmv->p, 0.0, &domain);
- ON_3dPoint cep = nc->PointAt(t);
- double ecdist = cep.DistanceTo(pmv->p);
- std::cout << "closest_dist: " << closest_dist << "\n";
- std::cout << "ecdist: " << ecdist << "\n";
- if (closest_dist > ecdist) {
- closest_dist = ecdist;
- closest_edge = eseg;
- split_t = t;
- }
- }
-
- if (closest_edge) {
- std::cout << "edge split\n";
- std::cout << "estart: " << closest_edge->e_start->x << "," <<
closest_edge->e_start->y << "," << closest_edge->e_start->z << "\n";
- std::cout << "eend : " << closest_edge->e_end->x << "," <<
closest_edge->e_end->y << "," << closest_edge->e_end->z << "\n";
- asegs.erase(closest_edge);
- split_segs.insert(closest_edge);
- std::set<cdt_mesh::bedge_seg_t *> nsegs;
-
-#if 1
- /* NOTE - need to get this information before ovlp_split_edge
invalidates closest_edge */
- struct ON_Brep_CDT_State *s_cdt_edge = (struct
ON_Brep_CDT_State *)closest_edge->p_cdt;
- int f_id1 =
s_cdt_edge->brep->m_T[closest_edge->tseg1->trim_ind].Face()->m_face_index;
- int f_id2 =
s_cdt_edge->brep->m_T[closest_edge->tseg2->trim_ind].Face()->m_face_index;
-#endif
- ovlp_split_edge(&nsegs, closest_edge, split_t, f2omap);
-#if 1
- cdt_mesh::cdt_mesh_t &fmesh_f1 = s_cdt_edge->fmeshes[f_id1];
- cdt_mesh::cdt_mesh_t &fmesh_f2 = s_cdt_edge->fmeshes[f_id2];
- std::cout << s_cdt_edge->name << " face " << fmesh_f1.f_id << "
validity: " << fmesh_f1.valid(1) << "\n";
- std::cout << s_cdt_edge->name << " face " << fmesh_f2.f_id << "
validity: " << fmesh_f2.valid(1) << "\n";
- struct bu_vls fename = BU_VLS_INIT_ZERO;
- bu_vls_sprintf(&fename, "%s-%d_post_edge_tris.plot3",
s_cdt_edge->name, fmesh_f1.f_id);
- fmesh_f1.tris_plot(bu_vls_cstr(&fename));
- bu_vls_sprintf(&fename, "%s-%d_post_edge_tris.plot3",
s_cdt_edge->name, fmesh_f2.f_id);
- fmesh_f2.tris_plot(bu_vls_cstr(&fename));
- bu_vls_free(&fename);
-#endif
-
- asegs.insert(nsegs.begin(), nsegs.end());
- }
- }
- }
-}
-
void
tri_retessellate(cdt_mesh::cdt_mesh_t *fmesh, long t_ind, std::set<struct
p_mvert_info *> &npnts)
{
@@ -2852,6 +2358,7 @@
}
}
}
+#endif
int
ON_Brep_CDT_Ovlp_Resolve(struct ON_Brep_CDT_State **s_a, int s_cnt)
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