mathutil: Gracefully deal with "tails" in Triangulator

Fixes #985
This commit is contained in:
rdb 2020-08-18 17:58:28 +02:00
parent 5ef1db3fd3
commit 7b9b65693a
1 changed files with 32 additions and 0 deletions

View File

@ -279,6 +279,38 @@ cleanup_polygon_indices(vector_int &polygon) {
// The last vertex repeats the first one; remove it.
polygon.pop_back();
}
// Another pass over the polygons, this time removing any "tails".
while (polygon.size() >= 3) {
bool removed_any = false;
int prevprev = polygon[polygon.size() - 2];
int prev = polygon[polygon.size() - 1];
for (size_t i = 0; i < polygon.size(); ++i) {
int cur = polygon[i];
if (_vertices[prevprev] == _vertices[cur]) {
// Cut off the tail.
removed_any = true;
polygon.erase(polygon.begin() + i);
if (i == 0) {
polygon.pop_back();
} else {
polygon.erase(polygon.begin() + i - 1);
}
break;
}
prevprev = prev;
prev = cur;
}
// This might have been the tip of a longer tail, so if we removed
// something, go again.
if (!removed_any) {
break;
}
}
}