Revision: 73804
http://sourceforge.net/p/brlcad/code/73804
Author: starseeker
Date: 2019-08-31 14:37:53 +0000 (Sat, 31 Aug 2019)
Log Message:
-----------
If we want the polygon to be robust to degenerate edge manipulations, we have
to act on ordered rather than unordered edges. Repair situations preclude this
happening by always starting with a triangle, but face loops may begin (in the
early stages of splitting) with degenerate edges. The cylinder with a closed
loop edge was getting a 0-1 and 1-0 edges, which needed to be distinct for
subsequent splitting but were the same when converted to an unordered edge. We
want the unordered insertion for robustness in repair situations, where we may
need to walk over odd edges, but for face loop building our ordering is
constrained by the loop itself. Add API to the polygon that lets us bypass the
unordering portion of the edge insertion/removal logic for this case.
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt2.cpp
brlcad/trunk/src/libbrep/cdt_mesh.cpp
brlcad/trunk/src/libbrep/cdt_mesh.h
Modified: brlcad/trunk/src/libbrep/cdt2.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt2.cpp 2019-08-30 20:40:01 UTC (rev 73803)
+++ brlcad/trunk/src/libbrep/cdt2.cpp 2019-08-31 14:37:53 UTC (rev 73804)
@@ -66,21 +66,26 @@
(*d_cnt)++;
std::cout << "\n";
}
-
+#endif
+#if 0
void
debug_bseg(cdt_mesh::bedge_seg_t *bseg, int seg_id)
{
+#if 0
int face_index = 34;
if (bseg->edge_ind < 93 && bseg->edge_ind > 96) return;
+#endif
ON_BrepEdge& edge = bseg->brep->m_E[bseg->edge_ind];
ON_BrepTrim *trim1 = edge.Trim(0);
ON_BrepTrim *trim2 = edge.Trim(1);
if (!trim1 || !trim2) return ;
+
+#if 0
if (trim1->Face()->m_face_index != face_index &&
trim2->Face()->m_face_index != face_index) return;
ON_BrepTrim *ftrim = (trim1->Face()->m_face_index == face_index) ? trim1 :
trim2;
cdt_mesh::cpolyedge_t *tseg = (bseg->tseg1->trim_ind ==
ftrim->m_trim_index) ? bseg->tseg1 : bseg->tseg2;
- std::cout << "Face " << face_index << " bseg " << bseg->edge_ind << "-" <<
seg_id << ", trim " << tseg->trim_ind << " (" <<
bseg->brep->m_T[tseg->trim_ind].m_bRev3d << "):\n";
+ std::cout << "bseg " << bseg->edge_ind << "-" << seg_id << ", trim " <<
tseg->trim_ind << " (" << bseg->brep->m_T[tseg->trim_ind].m_bRev3d << "):\n";
std::cout << " edge point start (x,y,z): (" << bseg->e_start->x << ","
<< bseg->e_start->y << "," << bseg->e_start->z << ")\n";
ON_3dPoint es = bseg->nc->PointAt(bseg->edge_start);
std::cout << " edge_start (t)(x,y,z): (" << bseg->edge_start << ") (" <<
es.x << "," << es.y << "," << es.z << ")\n";
@@ -87,7 +92,6 @@
std::cout << " edge point end (x,y,z): (" << bseg->e_end->x << "," <<
bseg->e_end->y << "," << bseg->e_end->z << ")\n";
ON_3dPoint ee = bseg->nc->PointAt(bseg->edge_end);
std::cout << " edge_end (t)(x,y,z): (" << bseg->edge_end << ") (" <<
ee.x << "," << ee.y << "," << ee.z << ")\n";
-
ON_2dPoint p2s = ftrim->PointAt(tseg->trim_start);
ON_2dPoint p2e = ftrim->PointAt(tseg->trim_end);
@@ -111,7 +115,15 @@
std::cout << " WARNING - bseg edge and trim end points
don't match\n";
}
}
+#endif
+ std::cout << "bseg " << bseg->edge_ind << "-" << seg_id << ":\n";
+ std::cout << "tseg1(" << bseg->tseg1->v[0] << "," << bseg->tseg1->v[1] <<
") polygon: ";
+ bseg->tseg1->polygon->print();
+ std::cout << "tseg2(" << bseg->tseg2->v[0] << "," << bseg->tseg2->v[1] <<
") polygon: ";
+ bseg->tseg2->polygon->print();
+ std::cout << "\n";
+
}
#endif
@@ -557,16 +569,16 @@
int trim_ind = bseg->tseg1->trim_ind;
double old_trim_start = bseg->tseg1->trim_start;
double old_trim_end = bseg->tseg1->trim_end;
- poly1->remove_edge(cdt_mesh::edge_t(v[0], v[1]));
+ poly1->remove_ordered_edge(cdt_mesh::edge_t(v[0], v[1]));
long poly1_2dind = poly1->add_point(trim1_mid_2d, f1_ind2d);
struct cdt_mesh::edge_t poly1_edge1(v[0], poly1_2dind);
- poly1_ne1 = poly1->add_edge(poly1_edge1);
+ poly1_ne1 = poly1->add_ordered_edge(poly1_edge1);
poly1_ne1->trim_ind = trim_ind;
poly1_ne1->trim_start = old_trim_start;
poly1_ne1->trim_end = t1mid;
poly1_ne1->eseg = bseg1;
struct cdt_mesh::edge_t poly1_edge2(poly1_2dind, v[1]);
- poly1_ne2 = poly1->add_edge(poly1_edge2);
+ poly1_ne2 = poly1->add_ordered_edge(poly1_edge2);
poly1_ne2->trim_ind = trim_ind;
poly1_ne2->trim_start = t1mid;
poly1_ne2->trim_end = old_trim_end;
@@ -580,16 +592,16 @@
int trim_ind = bseg->tseg2->trim_ind;
double old_trim_start = bseg->tseg2->trim_start;
double old_trim_end = bseg->tseg2->trim_end;
- poly2->remove_edge(cdt_mesh::edge_t(v[0], v[1]));
+ poly2->remove_ordered_edge(cdt_mesh::edge_t(v[0], v[1]));
long poly2_2dind = poly2->add_point(trim2_mid_2d, f2_ind2d);
struct cdt_mesh::edge_t poly2_edge1(v[0], poly2_2dind);
- poly2_ne1 = poly2->add_edge(poly2_edge1);
+ poly2_ne1 = poly2->add_ordered_edge(poly2_edge1);
poly2_ne1->trim_ind = trim_ind;
poly2_ne1->trim_start = old_trim_start;
poly2_ne1->trim_end = t2mid;
poly2_ne1->eseg = bseg1;
struct cdt_mesh::edge_t poly2_edge2(poly2_2dind, v[1]);
- poly2_ne2 = poly2->add_edge(poly2_edge2);
+ poly2_ne2 = poly2->add_ordered_edge(poly2_edge2);
poly2_ne2->trim_ind = trim_ind;
poly2_ne2->trim_start = t2mid;
poly2_ne2->trim_end = old_trim_end;
@@ -633,6 +645,7 @@
// 1. Any edges with at least 1 closed trim are split.
if (trim1->IsClosed() || trim2->IsClosed()) {
+ std::cout << "ec split : \n";
esegs_closed = split_edge_seg(s_cdt, e, 1);
if (!esegs_closed.size()) {
// split failed??
@@ -861,7 +874,7 @@
}
struct cdt_mesh::edge_t lseg(pv, cv);
- cdt_mesh::cpolyedge_t *ne = cpoly->add_edge(lseg);
+ cdt_mesh::cpolyedge_t *ne = cpoly->add_ordered_edge(lseg);
ne->trim_ind = trim->m_trim_index;
ne->trim_start = range.m_t[0];
Modified: brlcad/trunk/src/libbrep/cdt_mesh.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.cpp 2019-08-30 20:40:01 UTC (rev
73803)
+++ brlcad/trunk/src/libbrep/cdt_mesh.cpp 2019-08-31 14:37:53 UTC (rev
73804)
@@ -238,7 +238,86 @@
return (long)(pnts_2d.size() - 1);
}
+
cpolyedge_t *
+cpolygon_t::add_ordered_edge(const struct edge_t &e)
+{
+ if (e.v[0] == -1) return NULL;
+
+ struct edge_t ne(e);
+ cpolyedge_t *nedge = new cpolyedge_t(ne);
+ poly.insert(nedge);
+
+ nedge->polygon = this;
+
+ v2pe[e.v[0]].insert(nedge);
+ v2pe[e.v[1]].insert(nedge);
+
+ cpolyedge_t *prev = NULL;
+ cpolyedge_t *next = NULL;
+
+ std::set<cpolyedge_t *>::iterator cp_it;
+ for (cp_it = poly.begin(); cp_it != poly.end(); cp_it++) {
+ cpolyedge_t *pe = *cp_it;
+
+ if (pe == nedge) continue;
+
+ if (pe->v[1] == nedge->v[0]) {
+ prev = pe;
+ }
+
+ if (pe->v[0] == nedge->v[1]) {
+ next = pe;
+ }
+ }
+
+ if (prev) {
+ prev->next = nedge;
+ nedge->prev = prev;
+ }
+
+ if (next) {
+ next->prev = nedge;
+ nedge->next = next;
+ }
+
+ return nedge;
+}
+
+void
+cpolygon_t::remove_ordered_edge(const struct edge_t &e)
+{
+ cpolyedge_t *cull = NULL;
+ std::set<cpolyedge_t *>::iterator cp_it;
+ for (cp_it = poly.begin(); cp_it != poly.end(); cp_it++) {
+ cpolyedge_t *pe = *cp_it;
+ struct edge_t oe(pe->v[0], pe->v[1]);
+ if (e == oe) {
+ // Existing segment with this ending vertex exists
+ cull = pe;
+ break;
+ }
+ }
+
+ if (!cull) return;
+
+ v2pe[e.v[0]].erase(cull);
+ v2pe[e.v[1]].erase(cull);
+
+ for (cp_it = poly.begin(); cp_it != poly.end(); cp_it++) {
+ cpolyedge_t *pe = *cp_it;
+ if (pe->prev == cull) {
+ pe->prev = NULL;
+ }
+ if (pe->next == cull) {
+ pe->next = NULL;
+ }
+ }
+ poly.erase(cull);
+ delete cull;
+}
+
+cpolyedge_t *
cpolygon_t::add_edge(const struct uedge_t &ue)
{
if (ue.v[0] == -1) return NULL;
@@ -362,9 +441,7 @@
}
}
poly.erase(cull);
- // TODO - deleting this when there's only one entry present is messing up
- // the memory, but not sure why yet.
- //delete cull;
+ delete cull;
}
std::set<cpolyedge_t *>
Modified: brlcad/trunk/src/libbrep/cdt_mesh.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.h 2019-08-30 20:40:01 UTC (rev 73803)
+++ brlcad/trunk/src/libbrep/cdt_mesh.h 2019-08-31 14:37:53 UTC (rev 73804)
@@ -326,6 +326,9 @@
std::map<long, long> p2o;
/* Polygon edge manipulation */
+ cpolyedge_t *add_ordered_edge(const struct edge_t &e);
+ void remove_ordered_edge(const struct edge_t &e);
+
cpolyedge_t *add_edge(const struct uedge_t &e);
void remove_edge(const struct uedge_t &e);
std::set<cpolyedge_t *> replace_edges(std::set<uedge_t> &new_edges,
std::set<uedge_t> &old_edges);
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