Add a critical point where the set of rings using a polygon edge changes

This commit is contained in:
Eric Fischer
2016-10-05 17:16:18 -07:00
parent 04157e7728
commit f7daa05515
5 changed files with 163 additions and 12 deletions
+23 -9
View File
@@ -1042,17 +1042,19 @@ drawvec impose_tile_boundaries(drawvec &geom, long long extent) {
return out;
}
drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds, double simplification) {
drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds, double simplification, bool already_marked) {
int res = 1 << (32 - detail - z);
long long area = 1LL << (32 - z);
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
geom[i].necessary = 1;
} else if (geom[i].op == VT_LINETO) {
geom[i].necessary = 0;
} else {
geom[i].necessary = 1;
if (!already_marked) {
for (size_t i = 0; i < geom.size(); i++) {
if (geom[i].op == VT_MOVETO) {
geom[i].necessary = 1;
} else if (geom[i].op == VT_LINETO) {
geom[i].necessary = 0;
} else {
geom[i].necessary = 1;
}
}
}
@@ -1073,7 +1075,19 @@ drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds,
geom[j - 1].necessary = 1;
if (j - i > 1) {
douglas_peucker(geom, i, j - i, res * simplification);
if (already_marked && geom[j - 1] < geom[i]) {
drawvec dv;
for (size_t k = j; k > i; k--) {
dv.push_back(geom[k - 1]);
}
douglas_peucker(dv, 0, j - i, res * simplification);
size_t l = 0;
for (size_t k = j; k > i; k--) {
geom[k - 1] = dv[l++];
}
} else {
douglas_peucker(geom, i, j - i, res * simplification);
}
}
i = j - 1;
}