Revision: 74260
http://sourceforge.net/p/brlcad/code/74260
Author: starseeker
Date: 2019-10-29 20:04:12 +0000 (Tue, 29 Oct 2019)
Log Message:
-----------
The vertices introduced when splitting edges deserve special attention - we
know these are being introduced in an area close to another mesh, so we most
likely want/need to put new points in the other mesh close to these 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-29 14:33:51 UTC (rev
74259)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-10-29 20:04:12 UTC (rev
74260)
@@ -1574,8 +1574,12 @@
}
int
-ovlp_split_edge(std::set<cdt_mesh::bedge_seg_t *> *nsegs,
cdt_mesh::bedge_seg_t *eseg, double t,
- std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap)
+ovlp_split_edge(
+ std::set<cdt_mesh::bedge_seg_t *> *nsegs,
+ std::set<overt_t *> *nverts,
+ cdt_mesh::bedge_seg_t *eseg, double t,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
+ )
{
int replaced_tris = 0;
@@ -1646,6 +1650,12 @@
f2.ue2b_map[ue_2] = es;
}
+ // TODO - need to return one of the inserted verts from this
+ // process - we need to check if that point is going to require
+ // any splitting on any other objects' faces. Any triangle
+ // from another object "close" to the new point should have
+ // a vertex that can be adjusted, or if not one needs to be
+ // introduced.
long np_id;
if (f_id1 == f_id2) {
std::set<size_t> ftris;
@@ -1661,8 +1671,10 @@
replaced_tris++;
}
- f2omap[&fmesh_f1]->vert_add(np_id);
-
+ overt_t *nv = f2omap[&fmesh_f1]->vert_add(np_id);
+ if (nverts) {
+ nverts->insert(nv);
+ }
} else {
np_id = fmesh_f1.pnts.size() - 1;
fmesh_f1.ep.insert(np_id);
@@ -1669,7 +1681,12 @@
replace_edge_split_tri(fmesh_f1, *f1_tris.begin(), np_id, ue1);
replaced_tris++;
- f2omap[&fmesh_f1]->vert_add(np_id);
+ // Doesn't matter which overt we pick to return - they're both the same
+ // 3D point - return the first one
+ overt_t *nv = f2omap[&fmesh_f1]->vert_add(np_id);
+ if (nverts) {
+ nverts->insert(nv);
+ }
np_id = fmesh_f2.pnts.size() - 1;
fmesh_f2.ep.insert(np_id);
@@ -1687,7 +1704,8 @@
bedge_split_at_t(
cdt_mesh::bedge_seg_t *eseg, double t,
std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap,
- std::set<cdt_mesh::bedge_seg_t *> *nsegs
+ std::set<cdt_mesh::bedge_seg_t *> *nsegs,
+ std::set<overt_t *> *nverts
)
{
int replaced_tris = 0;
@@ -1705,7 +1723,7 @@
int f_id1 =
s_cdt_edge->brep->m_T[eseg->tseg1->trim_ind].Face()->m_face_index;
int f_id2 =
s_cdt_edge->brep->m_T[eseg->tseg2->trim_ind].Face()->m_face_index;
#endif
- int rtris = ovlp_split_edge(nsegs, eseg, t, f2omap);
+ int rtris = ovlp_split_edge(nsegs, nverts, eseg, t, f2omap);
if (rtris >= 0) {
replaced_tris += rtris;
#if 0
@@ -1734,7 +1752,8 @@
bedge_split_near_pnt(
cdt_mesh::bedge_seg_t *eseg, ON_3dPoint &p,
std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap,
- std::set<cdt_mesh::bedge_seg_t *> *nsegs
+ std::set<cdt_mesh::bedge_seg_t *> *nsegs,
+ std::set<overt_t *> *nverts
)
{
ON_NurbsCurve *nc = eseg->nc;
@@ -1741,7 +1760,7 @@
ON_Interval domain(eseg->edge_start, eseg->edge_end);
double t;
ON_NurbsCurve_GetClosestPoint(&t, nc, p, 0.0, &domain);
- return bedge_split_at_t(eseg, t, f2omap, nsegs);
+ return bedge_split_at_t(eseg, t, f2omap, nsegs, nverts);
}
// Find the point on the edge nearest to the vert point. (TODO - need to
think about how to
@@ -1749,6 +1768,7 @@
// and see if splitting clears the others...)
int
bedge_split_near_vert(
+ std::set<overt_t *> *nverts,
std::map<cdt_mesh::bedge_seg_t *, overt_t *> &edge_vert,
std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
@@ -1759,7 +1779,7 @@
cdt_mesh::bedge_seg_t *eseg = ev_it->first;
overt_t *v = ev_it->second;
ON_3dPoint p = v->vpnt();
- replaced_tris += bedge_split_near_pnt(eseg, p, f2omap, NULL);
+ replaced_tris += bedge_split_near_pnt(eseg, p, f2omap, NULL, nverts);
}
return replaced_tris;
}
@@ -1766,6 +1786,7 @@
int
bedge_split_near_verts(
+ std::set<overt_t *> *nverts,
std::map<cdt_mesh::bedge_seg_t *, std::set<overt_t *>> &edge_verts,
std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
@@ -1805,14 +1826,15 @@
}
std::set<cdt_mesh::bedge_seg_t *> nsegs;
- int ntri_cnt = bedge_split_at_t(eseg_split, split_t, f2omap,
&nsegs);
+ int ntri_cnt = bedge_split_at_t(eseg_split, split_t, f2omap,
&nsegs, nverts);
if (ntri_cnt) {
segs.erase(eseg_split);
- replaced_tris += ntri_cnt;
+ replaced_tris += ntri_cnt;
segs.insert(nsegs.begin(), nsegs.end());
}
}
}
+
return replaced_tris;
}
@@ -1860,6 +1882,7 @@
// cnt of overlapping triangles to arrive at a general solution later.
int
split_brep_face_edges_near_verts(
+ std::set<overt_t *> *nverts,
std::set<struct ON_Brep_CDT_State *> &a_cdt,
std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs,
std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
@@ -1929,7 +1952,8 @@
}
fclose(plot_file);
- return bedge_split_near_vert(edge_vert, f2omap);
+ int ret = bedge_split_near_vert(nverts, edge_vert, f2omap);
+ return ret;
// Now that we've done the initial split, find triangle intersections
involving
// triangles on brep face edges. For the points that project onto those
triangles,
@@ -2150,7 +2174,7 @@
cdt_mesh::bedge_seg_t *bseg = *brep_edges_to_split.begin();
brep_edges_to_split.erase(brep_edges_to_split.begin());
double tmid = (bseg->edge_start + bseg->edge_end) * 0.5;
- int rtris = ovlp_split_edge(NULL, bseg, tmid, f2omap);
+ int rtris = ovlp_split_edge(NULL, NULL, bseg, tmid, f2omap);
if (rtris <= 0) {
std::cout << "edge split failed!\n";
}
@@ -2192,7 +2216,7 @@
}
void
-omesh_interior_edge_verts(std::set<std::pair<omesh_t *, omesh_t *>>
&check_pairs)
+omesh_interior_edge_verts(std::set<std::pair<omesh_t *, omesh_t *>>
&check_pairs, std::set<overt_t *> &nverts)
{
std::set<omesh_t *> omeshes;
std::set<std::pair<omesh_t *, omesh_t *>>::iterator cp_it;
@@ -2206,6 +2230,9 @@
omeshes.insert(omesh2);
}
}
+
+ std::cout << "TODO check nverts:" << nverts.size() << "\n";
+
std::cout << "Need to split triangles in " << omeshes.size() << "
meshes\n";
std::set<omesh_t *>::iterator o_it;
@@ -2380,6 +2407,9 @@
int iterations = 0;
while (face_ov_cnt) {
+
+ std::set<overt_t *> nverts;
+
iterations++;
if (iterations > 1) break;
@@ -2390,7 +2420,7 @@
a_cdt.insert((struct ON_Brep_CDT_State *)p_it->first->p_cdt);
a_cdt.insert((struct ON_Brep_CDT_State *)p_it->second->p_cdt);
}
- int sbfvtri_cnt = split_brep_face_edges_near_verts(a_cdt, ocheck_pairs,
f2omap);
+ int sbfvtri_cnt = split_brep_face_edges_near_verts(&nverts, a_cdt,
ocheck_pairs, f2omap);
if (sbfvtri_cnt) {
std::cout << "Replaced " << sbfvtri_cnt << " triangles by splitting
edges near vertices\n";
check_faces_validity(check_pairs, 2);
@@ -2406,6 +2436,7 @@
std::cout << "Post vert adjustment " << close_vert_checks << "
overlap cnt: " << face_ov_cnt << "\n";
close_vert_checks++;
}
+ std::cout << "New pnt cnt: " << nverts.size() << "\n";
}
// Examine the triangle intersections, performing initial breakdown and
finding points
@@ -2426,7 +2457,7 @@
std::cout << "Edge curve has " << e_it->second.size() << " verts\n";
}
- bedge_split_near_verts(edge_verts, f2omap);
+ bedge_split_near_verts(&nverts, edge_verts, f2omap);
avcnt = adjust_close_verts(ocheck_pairs);
if (avcnt) {
@@ -2436,12 +2467,14 @@
std::cout << "Post vert adjustment " << close_vert_checks << "
overlap cnt: " << face_ov_cnt << "\n";
close_vert_checks++;
}
+
+ std::cout << "New vert pnt cnt: " << nverts.size() << "\n";
// Once edge splits are handled, use remaining closest points and find
nearest interior
// edge curve, building sets of points near each interior edge. Then,
for all interior
// edges, yank the two triangles associated with that edge, build a
polygon with interior
// points and tessellate.
- omesh_interior_edge_verts(ocheck_pairs);
+ omesh_interior_edge_verts(ocheck_pairs, nverts);
check_faces_validity(check_pairs, 4);
face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
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