Revision: 73860
http://sourceforge.net/p/brlcad/code/73860
Author: starseeker
Date: 2019-09-09 15:49:15 +0000 (Mon, 09 Sep 2019)
Log Message:
-----------
Not working yet, but start trying to do the splitting based on tree leaf
overlapping.
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt.cpp
brlcad/trunk/src/libbrep/cdt.h
brlcad/trunk/src/libbrep/cdt_edge.cpp
Modified: brlcad/trunk/src/libbrep/cdt.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt.cpp 2019-09-09 13:18:12 UTC (rev 73859)
+++ brlcad/trunk/src/libbrep/cdt.cpp 2019-09-09 15:49:15 UTC (rev 73860)
@@ -515,6 +515,13 @@
return -1;
}
+ // If edge segments are too close together in 2D space compared to their
+ // length, it is difficult to mesh them successfully. Refine edges that
+ // are close to other edges.
+ refine_close_edges(s_cdt);
+
+
+#if 0
// Check the CDT meshing - at this point, we should be able to produce
// a valid triangulation for all faces. If not, refine the larger
// curved edges until we can.
@@ -586,6 +593,7 @@
fmesh->reset();
}
+#endif
#if 0
// On to tolerance based splitting. Process the non-linear edges first
-
Modified: brlcad/trunk/src/libbrep/cdt.h
===================================================================
--- brlcad/trunk/src/libbrep/cdt.h 2019-09-09 13:18:12 UTC (rev 73859)
+++ brlcad/trunk/src/libbrep/cdt.h 2019-09-09 15:49:15 UTC (rev 73860)
@@ -191,6 +191,7 @@
split_singular_seg(struct ON_Brep_CDT_State *s_cdt, cdt_mesh::cpolyedge_t *ce);
bool initialize_edge_segs(struct ON_Brep_CDT_State *s_cdt);
+void refine_close_edges(struct ON_Brep_CDT_State *s_cdt);
std::vector<int> characterize_edges(struct ON_Brep_CDT_State *s_cdt);
void initialize_edge_containers(struct ON_Brep_CDT_State *s_cdt);
bool initialize_loop_polygons(struct ON_Brep_CDT_State *s_cdt,
std::set<cdt_mesh::cpolyedge_t *> *singular_edges);
Modified: brlcad/trunk/src/libbrep/cdt_edge.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-09 13:18:12 UTC (rev
73859)
+++ brlcad/trunk/src/libbrep/cdt_edge.cpp 2019-09-09 15:49:15 UTC (rev
73860)
@@ -305,7 +305,6 @@
return true;
}
-#if 0
struct rtree_minsplit_context {
struct ON_Brep_CDT_State *s_cdt;
std::set<cdt_mesh::bedge_seg_t *> *split_segs;
@@ -317,15 +316,17 @@
struct rtree_minsplit_context *context= (struct rtree_minsplit_context
*)a_context;
// Intersecting with oneself or immediate neighbors isn't cause for
splitting
- if (tseg == cseg || tseg == cseg->prev || tseg == cseg->next) return true;
+ if (tseg == context->cseg || tseg == context->cseg->prev || tseg ==
context->cseg->next) return true;
+ // TODO - do a size comparison - don't want to split really small edges
+ // just because they overlap with a long one - split the long one
+
// Mark this segment down as a segment to split
- context->split_segs->insert(tseg);
+ context->split_segs->insert(context->cseg->eseg);
// No need to keep checking if we already know we're going to split
return false;
}
-#endif
double
median_seg_len(std::vector<double> &lsegs)
@@ -1085,10 +1086,10 @@
initialize_edge_containers(struct ON_Brep_CDT_State *s_cdt)
{
ON_Brep* brep = s_cdt->brep;
-
+
// Charcterize the edges.
std::vector<int> edge_type = characterize_edges(s_cdt);
-
+
for (int index = 0; index < brep->m_E.Count(); index++) {
ON_BrepEdge& edge = brep->m_E[index];
cdt_mesh::bedge_seg_t *bseg = new cdt_mesh::bedge_seg_t;
@@ -1231,7 +1232,7 @@
struct cdt_mesh::edge_t lseg(pv, cv);
cdt_mesh::cpolyedge_t *ne = cpoly->add_ordered_edge(lseg);
-
+
ne->trim_ind = trim->m_trim_index;
ne->trim_start = range.m_t[0];
ne->trim_end = range.m_t[1];
@@ -1619,16 +1620,15 @@
{
ON_Brep* brep = s_cdt->brep;
- // First, build the loop rtree and get the median lengths again. This
time we use all loop
- // segments, not just curved segments.
for (int index = 0; index < brep->m_L.Count(); index++) {
+ std::map<int, std::set<cdt_mesh::bedge_seg_t *>> new_edge_segs;
+ const ON_BrepLoop &loop = brep->m_L[index];
+ ON_BrepFace *face = loop.Face();
+ std::set<cdt_mesh::bedge_seg_t *> ws1, ws2;
+ std::set<cdt_mesh::bedge_seg_t *> *ws = &ws1;
+ std::set<cdt_mesh::bedge_seg_t *> *ns = &ws2;
- // Build the rtree leaf
- rtree_loop_2d(s_cdt, index);
-
- // Get inclusive median length
- const ON_BrepLoop &loop = brep->m_L[index];
- std::vector<double> lsegs;
+ // Build the initial set to check (all edges associated with a loop
trim)
for (int lti = 0; lti < loop.TrimCount(); lti++) {
ON_BrepTrim *trim = loop.Trim(lti);
ON_BrepEdge *edge = trim->Edge();
@@ -1640,90 +1640,89 @@
std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
cdt_mesh::bedge_seg_t *b = *e_it;
- double seg_dist = b->e_start->DistanceTo(*b->e_end);
- lsegs.push_back(seg_dist);
+ ws->insert(b);
}
}
- s_cdt->l_median_len[index] = median_seg_len(lsegs);
- }
- // Now, check all the edge segments to see if we are close to a loop with
- // smaller segments (or if our own loop has a median segment length smaller
- // than the current segment.) If so, split.
- for (int index = 0; index < brep->m_E.Count(); index++) {
- ON_BrepEdge& edge = brep->m_E[index];
- const ON_Curve* crv = edge.EdgeCurveOf();
- if (!crv) continue;
- std::set<cdt_mesh::bedge_seg_t *> &epsegs =
s_cdt->e2polysegs[edge.m_edge_index];
- std::set<cdt_mesh::bedge_seg_t *>::iterator e_it;
- std::set<cdt_mesh::bedge_seg_t *> new_segs;
- std::set<cdt_mesh::bedge_seg_t *> ws1, ws2;
- std::set<cdt_mesh::bedge_seg_t *> *ws = &ws1;
- std::set<cdt_mesh::bedge_seg_t *> *ns = &ws2;
- for (e_it = epsegs.begin(); e_it != epsegs.end(); e_it++) {
- cdt_mesh::bedge_seg_t *b = *e_it;
- ws->insert(b);
- }
+ // Check all the edge segments associated with the loop to see if our
bounding box overlaps with boxes
+ // that aren't our neighbor boxes. For any that do, split and check
again. Keep refining until we
+ // don't have any non-neighbor overlaps.
while (ws->size()) {
- cdt_mesh::bedge_seg_t *b = *ws->begin();
- ws->erase(ws->begin());
- bool split_edge = false;
- double target_len = DBL_MAX;
- for (int i = 0; i < 2; i++) {
- ON_BrepTrim *trim = edge.Trim(i);
- ON_BrepFace *face = trim->Face();
-
+ std::set<cdt_mesh::bedge_seg_t *> to_split;
+ std::set<cdt_mesh::bedge_seg_t *>::iterator w_it;
+ for (w_it = ws->begin(); w_it != ws->end(); w_it++) {
+ cdt_mesh::bedge_seg_t *b = *w_it;
// Get segment length - should be smaller than our target
length.
- cdt_mesh::cpolyedge_t *tseg = (b->tseg1->trim_ind ==
trim->m_trim_index) ? b->tseg1 : b->tseg2;
+ cdt_mesh::cpolyedge_t *tseg =
(s_cdt->brep->m_T[b->tseg1->trim_ind].Face()->m_face_index ==
face->m_face_index) ? b->tseg1 : b->tseg2;
ON_2dPoint p2d1 =
s_cdt->brep->m_T[tseg->trim_ind].PointAt(tseg->trim_start);
ON_2dPoint p2d2 =
s_cdt->brep->m_T[tseg->trim_ind].PointAt(tseg->trim_end);
- ON_Line l(p2d1, p2d2);
- double slen = l.Length();
+
// Trim 2D bbox
- ON_BoundingBox tbb(p2d1, p2d2);
+ ON_BoundingBox bb(p2d1, p2d2);
+ bb.m_max.x = bb.m_max.x + ON_ZERO_TOLERANCE;
+ bb.m_max.y = bb.m_max.y + ON_ZERO_TOLERANCE;
+ bb.m_min.x = bb.m_min.x - ON_ZERO_TOLERANCE;
+ bb.m_min.y = bb.m_min.y - ON_ZERO_TOLERANCE;
+ double dist = p2d1.DistanceTo(p2d2);
+ double bdist = 0.5*dist;
+ double xdist = bb.m_max.x - bb.m_min.x;
+ double ydist = bb.m_max.y - bb.m_min.y;
+ if (xdist < bdist) {
+ bb.m_min.x = bb.m_min.x - 0.51*bdist;
+ bb.m_max.x = bb.m_max.x + 0.51*bdist;
+ }
+ if (ydist < bdist) {
+ bb.m_min.y = bb.m_min.y - 0.51*bdist;
+ bb.m_max.y = bb.m_max.y + 0.51*bdist;
+ }
+
double tMin[2];
+ tMin[0] = bb.Min().x;
+ tMin[1] = bb.Min().y;
double tMax[2];
- double xbump = (fabs(tbb.Max().x - tbb.Min().x)) < slen ?
0.8*slen : ON_ZERO_TOLERANCE;
- double ybump = (fabs(tbb.Max().y - tbb.Min().y)) < slen ?
0.8*slen : ON_ZERO_TOLERANCE;
- tMin[0] = tbb.Min().x - xbump;
- tMin[1] = tbb.Min().y - ybump;
- tMax[0] = tbb.Max().x + xbump;
- tMax[1] = tbb.Max().y + ybump;
+ tMax[0] = bb.Max().x;
+ tMax[1] = bb.Max().y;
// Edge context info
- struct rtree_loop_context a_context;
- a_context.seg_len = l.Length();
- a_context.split_edge = &split_edge;
- a_context.target_len = DBL_MAX;
+ struct rtree_minsplit_context a_context;
+ a_context.s_cdt = s_cdt;
+ a_context.split_segs = &to_split;
+ a_context.cseg = tseg;
// Do the search
- if (!s_cdt->loops_2d[face->m_face_index].Search(tMin, tMax,
Loop2dCallback, (void *)&a_context)) {
- continue;
- } else {
- target_len = (a_context.target_len < target_len) ?
a_context.target_len : target_len;
- }
+ s_cdt->trim_segs[face->m_face_index].Search(tMin, tMax,
MinSplit2dCallback, (void *)&a_context);
}
- if (split_edge) {
- // If we need to split, do so
- std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 1);
- if (esegs_split.size()) {
- ws->insert(esegs_split.begin(), esegs_split.end());
+ // If we need to split, do so
+ for (w_it = ws->begin(); w_it != ws->end(); w_it++) {
+ cdt_mesh::bedge_seg_t *b = *w_it;
+ if (to_split.find(*w_it) != to_split.end()) {
+ std::set<cdt_mesh::bedge_seg_t *> esegs_split =
split_edge_seg(s_cdt, b, 1);
+ if (esegs_split.size()) {
+ ns->insert(esegs_split.begin(), esegs_split.end());
+ } else {
+ new_edge_segs[b->edge_ind].insert(b);
+ }
} else {
- new_segs.insert(b);
+ new_edge_segs[b->edge_ind].insert(b);
}
- } else {
- new_segs.insert(b);
}
- if (!ws->size() && ns->size()) {
+ ws->clear();
+ if (ns->size()) {
std::set<cdt_mesh::bedge_seg_t *> *tmp = ws;
ws = ns;
ns = tmp;
}
}
- s_cdt->e2polysegs[edge.m_edge_index].clear();
- s_cdt->e2polysegs[edge.m_edge_index].insert(new_segs.begin(),
new_segs.end());
- }
+
+ // Once we're done with this loop, update the e2polysegs sets
+ std::map<int, std::set<cdt_mesh::bedge_seg_t *>>::iterator m_it;
+ for (m_it = new_edge_segs.begin(); m_it != new_edge_segs.end(); m_it++)
{
+ int m_edge_index = m_it->first;
+ s_cdt->e2polysegs[m_edge_index].clear();
+ s_cdt->e2polysegs[m_edge_index].insert(m_it->second.begin(),
m_it->second.end());
+ }
+ }
}
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