Revision: 73906
http://sourceforge.net/p/brlcad/code/73906
Author: starseeker
Date: 2019-09-12 15:06:25 +0000 (Thu, 12 Sep 2019)
Log Message:
-----------
got a crash to reproduce. steiner points can't be on the outer loop.
Modified Paths:
--------------
brlcad/trunk/src/libbrep/cdt_mesh.cpp
Modified: brlcad/trunk/src/libbrep/cdt_mesh.cpp
===================================================================
--- brlcad/trunk/src/libbrep/cdt_mesh.cpp 2019-09-12 14:35:11 UTC (rev
73905)
+++ brlcad/trunk/src/libbrep/cdt_mesh.cpp 2019-09-12 15:06:25 UTC (rev
73906)
@@ -963,15 +963,7 @@
sfile << "int *faces = NULL;\nint num_faces = 0;int *steiner = NULL;\n";
- if (interior_points.size()) {
- sfile << "steiner = (int *)bu_calloc(" << interior_points.size() << ",
sizeof(int), \"interior points\");\n";
- std::set<long>::iterator p_it;
- int vind = 0;
- for (p_it = interior_points.begin(); p_it != interior_points.end();
p_it++) {
- sfile << "steiner[" << vind << "] = " << *p_it << ";\n";
- vind++;
- }
- }
+ std::set<long> oloop_pnts;
sfile << "int *opoly = (int *)bu_calloc(" << poly.size()+1 << ",
sizeof(int), \"polygon points\");\n";
@@ -982,12 +974,14 @@
sfile << "opoly[" << vcnt-1 << "] = " << pe->v[0] << ";\n";
sfile << "opoly[" << vcnt << "] = " << pe->v[1] << ";\n";
+ oloop_pnts.insert(pe->v[0]);
+ oloop_pnts.insert(pe->v[1]);
-
// Walk the loop
while (first != next) {
vcnt++;
sfile << "opoly[" << vcnt << "] = " << next->v[1] << ";\n";
+ oloop_pnts.insert(next->v[1]);
next = next->next;
if (vcnt > poly.size()) {
return;
@@ -994,6 +988,31 @@
}
}
+ if (interior_points.size()) {
+ std::set<long> erase;
+ std::set<long>::iterator p_it;
+ for (p_it = interior_points.begin(); p_it != interior_points.end();
p_it++) {
+ if (oloop_pnts.find(*p_it) != oloop_pnts.end()) {
+ erase.insert(*p_it);
+ }
+ }
+ for (p_it = erase.begin(); p_it != erase.end(); p_it++) {
+ interior_points.erase(*p_it);
+ }
+ }
+
+ size_t steiner_cnt = interior_points.size();
+ if (steiner_cnt) {
+ sfile << "steiner = (int *)bu_calloc(" << interior_points.size() << ",
sizeof(int), \"interior points\");\n";
+ std::set<long>::iterator p_it;
+ int vind = 0;
+ for (p_it = interior_points.begin(); p_it != interior_points.end();
p_it++) {
+ sfile << "steiner[" << vind << "] = " << *p_it << ";\n";
+ vind++;
+ }
+ }
+
+
sfile << "int result = !bg_nested_polygon_triangulate(&faces,
&num_faces,\n";
sfile << " NULL, NULL, opoly, " << poly.size()+1 << ", NULL,
NULL, 0,\n";
sfile << " steiner, " << interior_points.size() << ", pnts_2d,
" << pnts_2d.size() << ", TRI_CONSTRAINED_DELAUNAY);\n";
@@ -1018,15 +1037,7 @@
int *faces = NULL;
int num_faces = 0;
int *steiner = NULL;
- if (interior_points.size()) {
- steiner = (int *)bu_calloc(interior_points.size(), sizeof(int),
"interior points");
- std::set<long>::iterator p_it;
- int vind = 0;
- for (p_it = interior_points.begin(); p_it != interior_points.end();
p_it++) {
- steiner[vind] = (int)*p_it;
- vind++;
- }
- }
+ std::set<long> oloop_pnts;
int *opoly = (int *)bu_calloc(poly.size()+1, sizeof(int), "polygon
points");
@@ -1037,11 +1048,14 @@
opoly[vcnt-1] = pe->v[0];
opoly[vcnt] = pe->v[1];
+ oloop_pnts.insert(pe->v[0]);
+ oloop_pnts.insert(pe->v[1]);
// Walk the loop
while (first != next) {
vcnt++;
opoly[vcnt] = next->v[1];
+ oloop_pnts.insert(next->v[1]);
next = next->next;
if (vcnt > poly.size()) {
bu_free(bgp_2d, "free libbg 2d points array)");
@@ -1050,9 +1064,33 @@
}
}
+ if (interior_points.size()) {
+ std::set<long> erase;
+ std::set<long>::iterator p_it;
+ for (p_it = interior_points.begin(); p_it != interior_points.end();
p_it++) {
+ if (oloop_pnts.find(*p_it) != oloop_pnts.end()) {
+ erase.insert(*p_it);
+ }
+ }
+ for (p_it = erase.begin(); p_it != erase.end(); p_it++) {
+ interior_points.erase(*p_it);
+ }
+ }
+
+ size_t steiner_cnt = interior_points.size();
+ if (steiner_cnt) {
+ steiner = (int *)bu_calloc(steiner_cnt, sizeof(int), "interior points");
+ std::set<long>::iterator p_it;
+ int vind = 0;
+ for (p_it = interior_points.begin(); p_it != interior_points.end();
p_it++) {
+ steiner[vind] = (int)*p_it;
+ vind++;
+ }
+ }
+
bool result = (bool)!bg_nested_polygon_triangulate(&faces, &num_faces,
NULL, NULL, opoly, poly.size()+1, NULL, NULL, 0, steiner,
- interior_points.size(), bgp_2d, pnts_2d.size(),
+ steiner_cnt, bgp_2d, pnts_2d.size(),
TRI_CONSTRAINED_DELAUNAY);
if (result) {
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