diff --git a/geometry.cpp b/geometry.cpp index 66445c99..aa89c863 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -869,9 +869,17 @@ static void douglas_peucker(drawvec &geom, int start, int n, double e, size_t ke double distance = std::fabs(temp_dist); - if ((distance > e || kept < retain) && distance > max_distance) { - farthest_element_index = i; - max_distance = distance; + if ((distance > e || kept < retain) && distance >= max_distance) { + if (distance > max_distance) { + farthest_element_index = i; + max_distance = distance; + } else if (geom[i].y > geom[farthest_element_index].y) { + farthest_element_index = i; + max_distance = distance; + } else if (geom[i].y == geom[farthest_element_index].y && geom[i].x == geom[farthest_element_index].x) { + farthest_element_index = i; + max_distance = distance; + } } } @@ -968,20 +976,28 @@ drawvec simplify_lines(drawvec &geom, int z, int detail, bool mark_tile_bounds, geom[i].necessary = 1; geom[j - 1].necessary = 1; - // empirical mapping from douglas-peucker simplifications - // to visvalingam simplifications that yield similar - // output sizes - double sim = simplification * (0.1596 * z + 0.878); - double scale = (res * sim) * (res * sim); - scale = exp(1.002 * log(scale) + 0.3043); + size_t start = i; + for (size_t k = start + 1; k <= j - 1; k++) { + if (geom[k].necessary) { + if (k - start > 1) { + // empirical mapping from douglas-peucker simplifications + // to visvalingam simplifications that yield similar + // output sizes + double sim = simplification * (0.1596 * z + 0.878); + double scale = (res * sim) * (res * sim); + scale = exp(1.002 * log(scale) + 0.3043); - if (j - i > 1) { - if (additional[A_VISVALINGAM]) { - visvalingam(geom, i, j, scale, retain); - } else { - douglas_peucker(geom, i, j - i, res * simplification, 2, retain); + if (additional[A_VISVALINGAM]) { + visvalingam(geom, start, k + 1, scale, retain); + } else { + douglas_peucker(geom, start, k + 1 - start, res * simplification, 2, retain); + } + } + + start = k; } } + i = j - 1; } } diff --git a/tile.cpp b/tile.cpp index 4a10018d..51e27881 100644 --- a/tile.cpp +++ b/tile.cpp @@ -588,9 +588,29 @@ void *partial_feature_worker(void *v) { std::vector *partials = a->partials; std::set> kept; + for (size_t i = 0; i < (*partials).size(); i++) { + for (size_t j = 0; j < (*partials)[i].geoms.size(); j++) { + (*partials)[i].geoms[j] = remove_noop((*partials)[i].geoms[j], (*partials)[i].t, 0); + } + } + + for (size_t n = 0; n < 20; n++) { + size_t before = kept.size(); + + for (size_t i = a->task; i < (*partials).size(); i += a->tasks) { + auto stash = (*partials)[i].geoms; + double area = simplify_partial(&((*partials)[i]), *(a->shared_nodes), kept); + (*partials)[i].geoms = stash; + } + + printf("%zu nodes kept\n", kept.size()); + if (kept.size() == before) { + break; + } + } + for (size_t i = a->task; i < (*partials).size(); i += a->tasks) { double area = simplify_partial(&((*partials)[i]), *(a->shared_nodes), kept); - signed char t = (*partials)[i].t; int z = (*partials)[i].z; int out_detail = (*partials)[i].extra_detail;