Revision: 73805
http://sourceforge.net/p/brlcad/code/73805
Author: starseeker
Date: 2019-08-31 16:01:14 +0000 (Sat, 31 Aug 2019)
Log Message:
-----------
Add a similar ability to the cdt.cpp curve building - break down the singular
2D trims so the 2D CDT algorithm has more points to target along singularity
trims.
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt2.cpp
Modified: brlcad/trunk/src/libbrep/cdt2.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt2.cpp 2019-08-31 14:37:53 UTC (rev 73804)
+++ brlcad/trunk/src/libbrep/cdt2.cpp 2019-08-31 16:01:14 UTC (rev 73805)
@@ -26,6 +26,9 @@
*/
#include "common.h"
+
+#include <queue>
+
#include "bg/chull.h"
#include "./cdt.h"
@@ -627,7 +630,55 @@
return nedges;
}
+std::set<cdt_mesh::cpolyedge_t *>
+split_singular_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::cpolyedge_t *ce)
+{
+ std::set<cdt_mesh::cpolyedge_t *> nedges;
+ cdt_mesh::cpolygon_t *poly = ce->polygon;
+ int trim_ind = ce->trim_ind;
+ ON_BrepTrim& trim = s_cdt->brep->m_T[ce->trim_ind];
+ double tcparam = (ce->trim_start + ce->trim_end) / 2.0;
+ ON_3dPoint trim_mid_2d_ev = trim.PointAt(tcparam);
+ ON_2dPoint trim_mid_2d(trim_mid_2d_ev.x, trim_mid_2d_ev.y);
+
+ ON_BrepFace *face = trim.Face();
+ cdt_mesh::cdt_mesh_t *fmesh = &s_cdt->fmeshes[face->m_face_index];
+ long f_ind2d = fmesh->add_point(trim_mid_2d);
+
+ // Singularity - new 2D point points to the same 3D point as both of the
existing
+ // vertices
+ fmesh->p2d3d[f_ind2d] = fmesh->p2d3d[poly->p2o[ce->v[0]]];
+
+ // Using the 2d mid points, update the polygons associated with tseg1 and
tseg2.
+ cdt_mesh::cpolyedge_t *poly_ne1, *poly_ne2;
+ int v[2];
+ v[0] = ce->v[0];
+ v[1] = ce->v[1];
+ double old_trim_start = ce->trim_start;
+ double old_trim_end = ce->trim_end;
+ poly->remove_edge(cdt_mesh::edge_t(v[0], v[1]));
+ long poly_2dind = poly->add_point(trim_mid_2d, f_ind2d);
+ struct cdt_mesh::edge_t poly_edge1(v[0], poly_2dind);
+ poly_ne1 = poly->add_edge(poly_edge1);
+ poly_ne1->trim_ind = trim_ind;
+ poly_ne1->trim_start = old_trim_start;
+ poly_ne1->trim_end = tcparam;
+ poly_ne1->eseg = NULL;
+ struct cdt_mesh::edge_t poly_edge2(poly_2dind, v[1]);
+ poly_ne2 = poly->add_edge(poly_edge2);
+ poly_ne2->trim_ind = trim_ind;
+ poly_ne2->trim_start = tcparam;
+ poly_ne2->trim_end = old_trim_end;
+ poly_ne2->eseg = NULL;
+
+ nedges.insert(poly_ne1);
+ nedges.insert(poly_ne2);
+
+ return nedges;
+}
+
+
// There are a couple of edge splitting operations that have to happen in the
// beginning regardless of tolerance settings. Do them up front so the
subsequent
// working set has consistent properties.
@@ -1043,6 +1094,47 @@
// TODO - split singularity trims in 2D
if (singular_edges.size()) {
std::cout << "Have " << singular_edges.size() << " singular edges\n";
+ std::set<cdt_mesh::cpolyedge_t *>::iterator s_it;
+ size_t scnt = 0;
+ for (s_it = singular_edges.begin(); s_it != singular_edges.end();
s_it++) {
+ cdt_mesh::cpolyedge_t *edge = *s_it;
+ ON_BrepTrim& trim = s_cdt->brep->m_T[edge->trim_ind];
+ ON_BrepFace *face = trim.Face();
+ cdt_mesh::cpolygon_t *pg = edge->polygon;
+ struct bu_vls fname = BU_VLS_INIT_ZERO;
+ bu_vls_sprintf(&fname, "singularity-%zu-poly2d.p3", scnt);
+ pg->polygon_plot(bu_vls_cstr(&fname));
+ std::cout << "Pre-split polygon: ";
+ pg->print();
+ std::queue<cdt_mesh::cpolyedge_t *> w1, w2;
+ std::queue<cdt_mesh::cpolyedge_t *> *wq, *nq, *tmpq;
+ int cnt = 0;
+ wq = &w1;
+ nq = &w2;
+ nq->push(edge);
+ while (cnt < 6) {
+ cnt = 0;
+ tmpq = wq;
+ wq = nq;
+ nq = tmpq;
+ while (!wq->empty()) {
+ cdt_mesh::cpolyedge_t *ce = wq->front();
+ wq->pop();
+ std::set<cdt_mesh::cpolyedge_t *> nedges =
split_singular_seg(s_cdt, ce);
+ std::set<cdt_mesh::cpolyedge_t *>::iterator n_it;
+ for (n_it = nedges.begin(); n_it != nedges.end(); n_it++) {
+ nq->push(*n_it);
+ cnt++;
+ }
+ }
+ }
+ std::cout << "Post-split polygon: ";
+ pg->print();
+ bu_vls_sprintf(&fname, "singularity-%d-%zu-post_split-poly2d.p3",
face->m_face_index, scnt);
+ pg->polygon_plot(bu_vls_cstr(&fname));
+ bu_vls_free(&fname);
+ scnt++;
+ }
}
// Build RTrees of 2D and 3D edge segments for edge aware processing
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