Revision: 74214
http://sourceforge.net/p/brlcad/code/74214
Author: starseeker
Date: 2019-10-22 20:03:26 +0000 (Tue, 22 Oct 2019)
Log Message:
-----------
more bookkeeping work...
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-22 16:49:49 UTC (rev
74213)
+++ brlcad/trunk/src/libbrep/cdt_ovlps.cpp 2019-10-22 20:03:26 UTC (rev
74214)
@@ -753,8 +753,10 @@
if (interior_uedges.size()) {
nind = interior_uedges.rbegin()->first + 1;
}
+ //std::cout << "Setting ue " << nind << " to ue(" << ue.v[0] << "," <<
ue.v[1] << "\n";
interior_uedges[nind] = ue;
interior_uedge_ids[ue] = nind;
+ //std::cout << "interior_uedges.size(): " << interior_uedges.size() <<
"\n";
ON_3dPoint *p3d1 = fmesh->pnts[ue.v[0]];
ON_3dPoint *p3d2 = fmesh->pnts[ue.v[1]];
ON_Line l(*p3d1, *p3d2);
@@ -784,6 +786,7 @@
fMax[1] = ebb.Max().y;
fMax[2] = ebb.Max().z;
iedge_tree.Insert(fMin, fMax, nind);
+ //std::cout << "Adding edge " << nind << "\n";
if (update_verts) {
overts[ue.v[0]]->update();
@@ -801,26 +804,31 @@
void
omesh_t::edge_remove(cdt_mesh::uedge_t &ue, int update_verts)
{
+ // If we're being asked to remove an edge that's not in the working
+ // set, skip
+ if (interior_uedge_ids.find(ue) == interior_uedge_ids.end()) {
+ return;
+ }
size_t ue_id = interior_uedge_ids[ue];
ON_3dPoint *p3d1 = fmesh->pnts[ue.v[0]];
ON_3dPoint *p3d2 = fmesh->pnts[ue.v[1]];
ON_Line l(*p3d1, *p3d2);
ON_BoundingBox ebb = l.BoundingBox();
- double dist = 0.5*l.Length();
+ double dist = 0.51*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;
+ ebb.m_min.x = ebb.m_min.x - 0.51*dist;
+ ebb.m_max.x = ebb.m_max.x + 0.51*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;
+ ebb.m_min.y = ebb.m_min.y - 0.51*dist;
+ ebb.m_max.y = ebb.m_max.y + 0.51*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;
+ ebb.m_min.z = ebb.m_min.z - 0.51*dist;
+ ebb.m_max.z = ebb.m_max.z + 0.51*dist;
}
double fMin[3];
fMin[0] = ebb.Min().x;
@@ -834,6 +842,7 @@
interior_uedge_ids.erase(ue);
interior_uedges.erase(ue_id);
iedge_tree.Remove(fMin, fMax, ue_id);
+ //std::cout << "Removing edge " << ue_id << "\n";
if (update_verts) {
overts[ue.v[0]]->update();
@@ -1806,6 +1815,7 @@
std::set<cdt_mesh::uedge_t>::iterator n_it;
for (n_it = nedges.begin(); n_it != nedges.end(); n_it++) {
cdt_mesh::uedge_t ne = *n_it;
+ //std::cout << "Adding new interior edge " << ne.v[0] << "," << ne.v[1]
<< "\n";
f2omap[&fmesh]->edge_add(ne, 0);
}
@@ -2172,21 +2182,32 @@
// which point(s) from the opposite triangle are "inside" the
// meshes. Each of these points is an "overlap instance" that the
// opposite mesh will have to try and adjust itself to to resolve.
+ //
+ // If a vertex is not inside, we still may want to alter the mesh to
+ // incorporate its closest neighbor if it projects cleanly into the
+ // triangle (i.e it is "local").
ON_Plane plane1 = omesh1->fmesh->tplane(t1);
for (int i = 0; i < 3; i++) {
- //if (omesh1->intruding_pnts.find(omesh2->overts[t2.v[i]]) !=
omesh1->intruding_pnts.end()) continue;
ON_3dPoint tp = *omesh2->fmesh->pnts[t2.v[i]];
- double dist = plane1.DistanceTo(tp);
- if (dist < 0 && fabs(dist) > ON_ZERO_TOLERANCE &&
on_point_inside(s_cdt1, &tp)) {
+ overt_t *v = omesh2->overts[t2.v[i]];
+ if (!v) {
+ std::cout << "WARNING: - no overt for vertex??\n";
+ }
+ if (projects_inside_tri(omesh1->fmesh, t1, tp)) {
+ omesh1->intruding_pnts.insert(v);
+ have_interior_pnt = true;
+ } else {
+ double dist = plane1.DistanceTo(tp);
+ if (dist < 0 && fabs(dist) > ON_ZERO_TOLERANCE &&
on_point_inside(s_cdt1, &tp)) {
#if 0
- std::cout << s_cdt1->name << " face " <<
omesh1->fmesh->f_id << " test point inside from " << s_cdt2->name << " face "
<< omesh2->fmesh->f_id << ":\n";
- std::cout << "ip: " << omesh2->overts[t2.v[i]]->vpnt().x <<
"," << omesh2->overts[t2.v[i]]->vpnt().y << "," <<
omesh2->overts[t2.v[i]]->vpnt().z << "\n";
- std::cout << "dist: " << dist << "\n";
- std::cout << "isectpt1: " << isectpt1[X] << "," <<
isectpt1[Y] << "," << isectpt1[Z] << "\n";
- std::cout << "isectpt2: " << isectpt2[X] << "," <<
isectpt2[Y] << "," << isectpt2[Z] << "\n";
+ std::cout << s_cdt1->name << " face " <<
omesh1->fmesh->f_id << " test point inside from " << s_cdt2->name << " face "
<< omesh2->fmesh->f_id << ":\n";
+ std::cout << "ip: " <<
omesh2->overts[t2.v[i]]->vpnt().x << "," << omesh2->overts[t2.v[i]]->vpnt().y
<< "," << omesh2->overts[t2.v[i]]->vpnt().z << "\n";
+ std::cout << "dist: " << dist << "\n";
+ std::cout << "isectpt1: " << isectpt1[X] << "," <<
isectpt1[Y] << "," << isectpt1[Z] << "\n";
+ std::cout << "isectpt2: " << isectpt2[X] << "," <<
isectpt2[Y] << "," << isectpt2[Z] << "\n";
#endif
- omesh1->intruding_pnts.insert(omesh2->overts[t2.v[i]]);
- have_interior_pnt = true;
+ omesh1->intruding_pnts.insert(omesh2->overts[t2.v[i]]);
+ have_interior_pnt = true;
#if 0
closest_surf_pnt(np->p, np->n, *fmesh1, &tp,
2*t1_longest);
ON_BoundingBox bb(np->p, np->p);
@@ -2221,24 +2242,34 @@
added_verts[fmesh1].insert(std::make_pair(fmesh2,
t2.v[i]));
}
#endif
+ }
}
}
ON_Plane plane2 = omesh2->fmesh->tplane(t2);
for (int i = 0; i < 3; i++) {
- //if (omesh2->intruding_pnts.find(omesh1->overts[t1.v[i]]) !=
omesh2->intruding_pnts.end()) continue;
ON_3dPoint tp = *omesh1->fmesh->pnts[t1.v[i]];
- double dist = plane2.DistanceTo(tp);
- if (dist < 0 && fabs(dist) > ON_ZERO_TOLERANCE &&
on_point_inside(s_cdt2, &tp)) {
+ overt_t *v = omesh1->overts[t1.v[i]];
+ if (!v) {
+ std::cout << "WARNING: - no overt for vertex??\n";
+ }
+ if (projects_inside_tri(omesh2->fmesh, t2, tp)) {
+ omesh2->intruding_pnts.insert(v);
+ have_interior_pnt = true;
+ } else {
+
+ double dist = plane2.DistanceTo(tp);
+ if (dist < 0 && fabs(dist) > ON_ZERO_TOLERANCE &&
on_point_inside(s_cdt2, &tp)) {
#if 0
- std::cout << s_cdt2->name << " face " <<
omesh2->fmesh->f_id << " test point inside from " << s_cdt1->name << " face "
<< omesh1->fmesh->f_id << ":\n";
- std::cout << "ip: " << omesh1->overts[t1.v[i]]->vpnt().x <<
"," << omesh1->overts[t1.v[i]]->vpnt().y << "," <<
omesh1->overts[t1.v[i]]->vpnt().z << "\n";
- std::cout << "dist: " << dist << "\n";
- std::cout << "isectpt1: " << isectpt1[X] << "," <<
isectpt1[Y] << "," << isectpt1[Z] << "\n";
- std::cout << "isectpt2: " << isectpt2[X] << "," <<
isectpt2[Y] << "," << isectpt2[Z] << "\n";
+ std::cout << s_cdt2->name << " face " <<
omesh2->fmesh->f_id << " test point inside from " << s_cdt1->name << " face "
<< omesh1->fmesh->f_id << ":\n";
+ std::cout << "ip: " <<
omesh1->overts[t1.v[i]]->vpnt().x << "," << omesh1->overts[t1.v[i]]->vpnt().y
<< "," << omesh1->overts[t1.v[i]]->vpnt().z << "\n";
+ std::cout << "dist: " << dist << "\n";
+ std::cout << "isectpt1: " << isectpt1[X] << "," <<
isectpt1[Y] << "," << isectpt1[Z] << "\n";
+ std::cout << "isectpt2: " << isectpt2[X] << "," <<
isectpt2[Y] << "," << isectpt2[Z] << "\n";
#endif
- omesh2->intruding_pnts.insert(omesh1->overts[t1.v[i]]);
- have_interior_pnt = true;
+ omesh2->intruding_pnts.insert(omesh1->overts[t1.v[i]]);
+ have_interior_pnt = true;
+ }
}
}
if (!have_interior_pnt) {
@@ -2310,6 +2341,7 @@
}
std::cout << "Split " << brep_edges_to_split.size() << " brep edges\n";
+
while (brep_edges_to_split.size()) {
cdt_mesh::bedge_seg_t *bseg = *brep_edges_to_split.begin();
brep_edges_to_split.erase(brep_edges_to_split.begin());
@@ -2322,6 +2354,7 @@
for (o_it = omeshes.begin(); o_it != omeshes.end(); o_it++) {
omesh_t *omesh = *o_it;
+
std::set<cdt_mesh::uedge_t>::iterator u_it;
for (u_it = omesh->split_edges.begin(); u_it !=
omesh->split_edges.end(); u_it++) {
cdt_mesh::uedge_t ue = *u_it;
@@ -2332,11 +2365,20 @@
ON_3dPoint spnt;
ON_3dVector sn;
closest_surf_pnt(spnt, sn, *omesh->fmesh, &pmid, 2*dist);
+ 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;
+ 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];
+ 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);
+ }
+ omesh->vert_add(f3ind);
}
}
-
-
-
}
void
@@ -2698,6 +2740,7 @@
while (characterize_tri_intersections(ocheck_pairs) == 2) {
refine_omeshes(ocheck_pairs, f2omap);
+ face_ov_cnt = face_omesh_ovlps(ocheck_pairs);
}
//process_near_edge_pnts(face_npnts);
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