Revision: 74232
http://sourceforge.net/p/brlcad/code/74232
Author: starseeker
Date: 2019-10-24 20:31:27 +0000 (Thu, 24 Oct 2019)
Log Message:
-----------
checkpoint - working on a better way to tell when we need to split edge curves
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt_mesh.cpp
brlcad/trunk/src/libbrep/cdt_mesh.h
brlcad/trunk/src/libbrep/cdt_ovlps.cpp
Modified: brlcad/trunk/src/libbrep/cdt_mesh.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.cpp 2019-10-24 19:55:42 UTC (rev
74231)
+++ brlcad/trunk/src/libbrep/cdt_mesh.cpp 2019-10-24 20:31:27 UTC (rev
74232)
@@ -1779,6 +1779,27 @@
return uedges;
}
+
+uedge_t
+cdt_mesh_t::closest_uedge(const triangle_t &t, ON_3dPoint &p)
+{
+ uedge_t result;
+ std::set<uedge_t> ue_s = uedges(t);
+ std::set<uedge_t>::iterator u_it;
+ double mdist = DBL_MAX;
+ for (u_it = ue_s.begin(); u_it != ue_s.end(); u_it++) {
+ uedge_t ue = *u_it;
+ ON_Line l(*pnts[ue.v[0]], *pnts[ue.v[1]]);
+ double dline = p.DistanceTo(l.ClosestPointTo(p));
+ if (dline < mdist) {
+ mdist = dline;
+ result = ue;
+ }
+ }
+ return result;
+}
+
+
ON_3dVector
cdt_mesh_t::tnorm(const triangle_t &t)
{
Modified: brlcad/trunk/src/libbrep/cdt_mesh.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.h 2019-10-24 19:55:42 UTC (rev 74231)
+++ brlcad/trunk/src/libbrep/cdt_mesh.h 2019-10-24 20:31:27 UTC (rev 74232)
@@ -513,6 +513,10 @@
ON_Plane tplane(const triangle_t &t);
std::set<uedge_t> uedges(const triangle_t &t);
+ // Find the edge of the triangle that is closest to the
+ // specified point
+ uedge_t closest_uedge(const triangle_t &t, ON_3dPoint &p);
+
// Plot3 generation routines for debugging
void boundary_edges_plot(const char *filename);
void face_neighbors_plot(const triangle_t &f, const char *filename);
Modified: brlcad/trunk/src/libbrep/cdt_ovlps.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-10-24 19:55:42 UTC (rev
74231)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-10-24 20:31:27 UTC (rev
74232)
@@ -602,7 +602,10 @@
void
omesh_t::refine_pnt_remove(overt_t *v)
{
- if (refinement_overts_ids.find(v) == refinement_overts_ids.end()) return;
+ if (!refinement_overts_ids.size()) return;
+ 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);
@@ -1268,8 +1271,8 @@
v2->omesh->verts_one_ring_update(v2->p_id);
// If we're refining, adjustment is all we're going to do with these
verts
- v1->omesh->refine_pnt_remove(v1);
- v2->omesh->refine_pnt_remove(v2);
+ v1->omesh->refine_pnt_remove(v2);
+ v2->omesh->refine_pnt_remove(v1);
#if 0
std::cout << "p_wavg: " << p_wavg.x << "," << p_wavg.y << "," <<
p_wavg.z << "\n";
@@ -1352,14 +1355,15 @@
std::pair<overt_t *, overt_t *> vpair = vq.front();
vq.pop();
- adjust_overt_pair(vpair.first, vpair.second);
- adjusted.insert(vpair.first);
- adjusted.insert(vpair.second);
+ if (adjusted.find(vpair.first) == adjusted.end() &&
adjusted.find(vpair.second) == adjusted.end()) {
+ adjust_overt_pair(vpair.first, vpair.second);
+ adjusted.insert(vpair.first);
+ adjusted.insert(vpair.second);
+ }
}
// If the box structure is more complicated, we need to be a bit selective
while (vq_multi.size()) {
-
overt_t *l = get_largest_overt(vq_multi);
overt_t *c = closest_overt(vert_ovlps[l], l);
vq_multi.erase(l);
@@ -1367,9 +1371,11 @@
vert_ovlps[l].erase(c);
vert_ovlps[c].erase(l);
//std::cout << "COMPLEX - adjusting 1 pair only:\n";
- adjust_overt_pair(l, c);
- adjusted.insert(l);
- adjusted.insert(c);
+ if (adjusted.find(l) == adjusted.end() && adjusted.find(c) ==
adjusted.end()) {
+ adjust_overt_pair(l, c);
+ adjusted.insert(l);
+ adjusted.insert(c);
+ }
}
return adjusted.size();
@@ -1558,8 +1564,8 @@
}
int
-bedge_split_near_vert(
- std::map<cdt_mesh::bedge_seg_t *, overt_t *> &edge_vert,
+bedge_split_near_pnt(
+ std::map<cdt_mesh::bedge_seg_t *, ON_3dPoint> &edge_pnt,
std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
)
{
@@ -1567,26 +1573,18 @@
// 2. Find the point on the edge nearest to the vert point. (TODO - need
to think about how to
// handle multiple verts associated with same edge - may want to iterate
starting with the closest
// and see if splitting clears the others...)
- std::map<cdt_mesh::bedge_seg_t *, overt_t *>::iterator ev_it;
- for (ev_it = edge_vert.begin(); ev_it != edge_vert.end(); ev_it++) {
- cdt_mesh::bedge_seg_t *eseg = ev_it->first;
- overt_t *v = ev_it->second;
-
+ std::map<cdt_mesh::bedge_seg_t *, ON_3dPoint>::iterator ep_it;
+ for (ep_it = edge_pnt.begin(); ep_it != edge_pnt.end(); ep_it++) {
+ cdt_mesh::bedge_seg_t *eseg = ep_it->first;
+ ON_3dPoint p = ep_it->second;
ON_NurbsCurve *nc = eseg->nc;
ON_Interval domain(eseg->edge_start, eseg->edge_end);
- ON_3dPoint p = v->vpnt();
double t;
ON_NurbsCurve_GetClosestPoint(&t, nc, p, 0.0, &domain);
ON_3dPoint cep = nc->PointAt(t);
- //ON_3dPoint concern(2.599,7.821, 23.563);
- //if (cep.DistanceTo(concern) < 0.01) {
- //std::cout << "cep: " << cep.x << "," << cep.y << "," << cep.z << "\n";
- // std::cout << "Distance: " << cep.DistanceTo(p) << "\n";
- //}
double epdist1 = eseg->e_start->DistanceTo(cep);
double epdist2 = eseg->e_end->DistanceTo(cep);
double lseg_check = 0.1 * eseg->e_start->DistanceTo(*eseg->e_end);
- //std::cout << "d1: " << epdist1 << ", d2: " << epdist2 << ",
lseg_check: " << lseg_check << "\n";
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.
@@ -1599,8 +1597,6 @@
int rtris = ovlp_split_edge(NULL, eseg, t, f2omap);
if (rtris >= 0) {
replaced_tris += rtris;
-
-
#if 0
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];
@@ -1621,6 +1617,25 @@
return replaced_tris;
}
+// Find the point on the edge nearest to the vert point. (TODO - need to
think about how to
+// handle multiple verts associated with same edge - may want to iterate
starting with the closest
+// and see if splitting clears the others...)
+int
+bedge_split_near_vert(
+ std::map<cdt_mesh::bedge_seg_t *, overt_t *> &edge_vert,
+ std::map<cdt_mesh::cdt_mesh_t *, omesh_t *> &f2omap
+ )
+{
+ std::map<cdt_mesh::bedge_seg_t *, ON_3dPoint> edge_pnt;
+ std::map<cdt_mesh::bedge_seg_t *, overt_t *>::iterator ev_it;
+ for (ev_it = edge_vert.begin(); ev_it != edge_vert.end(); ev_it++) {
+ cdt_mesh::bedge_seg_t *eseg = ev_it->first;
+ overt_t *v = ev_it->second;
+ ON_3dPoint p = v->vpnt();
+ edge_pnt[eseg] = p;
+ }
+ return bedge_split_near_pnt(edge_pnt, f2omap);
+}
void
bedges_rtree(
@@ -1752,6 +1767,7 @@
// Iterate over verts, checking for nearby edges.
std::map<cdt_mesh::bedge_seg_t *, overt_t *> edge_vert;
+ std::map<cdt_mesh::bedge_seg_t *, ON_3dPoint> edge_pnt;
std::set<omesh_t *>::iterator a_it;
for (a_it = ameshes.begin(); a_it != ameshes.end(); a_it++) {
omesh_t *omesh = *a_it;
@@ -1788,10 +1804,12 @@
if (dv > dline) {
used_overts.erase(edge_vert[eseg]);
edge_vert[eseg] = v;
+ edge_pnt[eseg] = s1_p;
used_overts.insert(v);
}
} else {
edge_vert[eseg] = v;
+ edge_pnt[eseg] = s1_p;
used_overts.insert(v);
used_verts++;
}
@@ -1814,7 +1832,7 @@
omesh->refine_pnt_remove(*v_it);
}
}
- return bedge_split_near_vert(edge_vert, f2omap);
+ return bedge_split_near_pnt(edge_pnt, f2omap);
}
#if 0
@@ -1858,7 +1876,10 @@
// incorporate its closest neighbor if it projects cleanly into the
// triangle (i.e it is "local").
bool
-characterize_tri_verts(omesh_t *omesh1, omesh_t *omesh2, cdt_mesh::triangle_t
&t1, cdt_mesh::triangle_t &t2)
+characterize_tri_verts(
+ omesh_t *omesh1, omesh_t *omesh2, cdt_mesh::triangle_t &t1,
cdt_mesh::triangle_t &t2,
+ std::map<cdt_mesh::bedge_seg_t *, std::set<overt_t *>> &edge_verts
+ )
{
bool have_refinement_pnt = false;
ON_Plane plane1 = omesh1->fmesh->tplane(t1);
@@ -1872,7 +1893,8 @@
// at the nearest surface point
std::set<size_t> vtris = omesh2->fmesh->v2tris[t2.v[i]];
int tri_isect_cnt = 0;
- std::set<size_t>::iterator vt_it;
+ std::set<cdt_mesh::uedge_t> face_edges;
+ std::set<size_t>::iterator vt_it, ve_it;
for (vt_it = vtris.begin(); vt_it != vtris.end(); vt_it++) {
cdt_mesh::triangle_t ttri = omesh2->fmesh->tris_vect[*vt_it];
point_t isectpt1, isectpt2;
@@ -1882,6 +1904,20 @@
if (tri_isect_cnt > 1) {
omesh1->refine_pnt_add(v);
have_refinement_pnt = true;
+
+ // If this point is also close to a brep face edge, list that
edge/vert
+ // combination for splitting
+ ON_3dPoint vp = v->vpnt();
+ cdt_mesh::uedge_t closest_edge =
omesh1->fmesh->closest_uedge(t1, vp);
+ if (omesh1->fmesh->brep_edges.find(closest_edge) !=
omesh1->fmesh->brep_edges.end()) {
+ cdt_mesh::bedge_seg_t *bseg =
omesh1->fmesh->ue2b_map[closest_edge];
+ if (!bseg) {
+ std::cout << "couldn't find bseg pointer??\n";
+ } else {
+ edge_verts[bseg].insert(v);
+ }
+ }
+
break;
}
}
@@ -1892,7 +1928,10 @@
int
-characterize_tri_intersections(std::set<std::pair<omesh_t *, omesh_t *>>
&check_pairs)
+characterize_tri_intersections(
+ std::set<std::pair<omesh_t *, omesh_t *>> &check_pairs,
+ std::map<cdt_mesh::bedge_seg_t *, std::set<overt_t *>> &edge_verts
+ )
{
int ret = 0;
std::set<std::pair<omesh_t *, omesh_t *>>::iterator cp_it;
@@ -1921,8 +1960,8 @@
int isect = tri_isect(omesh1->fmesh, t1, omesh2->fmesh, t2,
&isectpt1, &isectpt2);
if (!isect) continue;
- bool h_ip_1 = characterize_tri_verts(omesh1, omesh2, t1, t2);
- bool h_ip_2 = characterize_tri_verts(omesh2, omesh1, t2, t1);
+ bool h_ip_1 = characterize_tri_verts(omesh1, omesh2, t1, t2,
edge_verts);
+ bool h_ip_2 = characterize_tri_verts(omesh2, omesh1, t2, t1,
edge_verts);
bool have_interior_pnt = (h_ip_1 || h_ip_2);
if (!have_interior_pnt) {
@@ -2299,9 +2338,12 @@
// Examine the triangle intersections, performing initial breakdown and
finding points
// that need to be handled by neighboring meshes.
- while (characterize_tri_intersections(ocheck_pairs) == 2) {
+ std::map<cdt_mesh::bedge_seg_t *, std::set<overt_t *>> edge_verts;
+ edge_verts.clear();
+ while (characterize_tri_intersections(ocheck_pairs, edge_verts) == 2) {
refine_omeshes(ocheck_pairs, f2omap);
face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
+ edge_verts.clear();
}
avcnt = adjust_close_verts(ocheck_pairs);
@@ -2330,6 +2372,7 @@
//process_near_edge_pnts(face_npnts);
+ check_faces_validity(check_pairs, 1);
face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
//std::cout << "Post interior-near-edge split overlap cnt: " <<
face_ov_cnt << "\n";
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