Fix collapse of islands to shards

This commit is contained in:
Erica Fischer
2023-09-08 14:34:34 -07:00
parent b5bf9d7dc5
commit af5035f9d3
3 changed files with 9 additions and 11 deletions
+1 -1
View File
@@ -383,7 +383,7 @@ size_t bits(long long n) {
return 64;
}
static long long square_distance_from_line(long long point_x, long long point_y, long long segA_x, long long segA_y, long long segB_x, long long segB_y, long long divisor) {
long long square_distance_from_line(long long point_x, long long point_y, long long segA_x, long long segA_y, long long segB_x, long long segB_y, long long divisor) {
// long long fpversion = square_distance_from_line_fp(point_x, point_y, segA_x, segA_y, segB_x, segB_y);
if (divisor != 1) {
+1
View File
@@ -91,6 +91,7 @@ drawvec clip_lines(drawvec &geom, long long x1, long long y1, long long x2, long
drawvec clip_point(drawvec &geom, long long x1, long long y1, long long x2, long long y2);
void visvalingam(drawvec &ls, size_t start, size_t end, double threshold, size_t retain);
int pnpoly(const drawvec &vert, size_t start, size_t nvert, long long testx, long long testy);
long long square_distance_from_line(long long point_x, long long point_y, long long segA_x, long long segA_y, long long segB_x, long long segB_y, long long divisor);
std::string overzoom(std::string s, int oz, int ox, int oy, int nz, int nx, int ny,
int detail, int buffer, std::set<std::string> const &keep);
+7 -10
View File
@@ -2329,16 +2329,13 @@ long long write_tile(decompressor *geoms, std::atomic<long long> *geompos_in, ch
size_t which2 = i;
for (size_t k = i + 1; k < j - 1; k++) {
double xd = sf.geometry[k].x - sf.geometry[i].x;
double yd = sf.geometry[k].y - sf.geometry[i].y;
double xd2 = sf.geometry[k].x - sf.geometry[which].x;
double yd2 = sf.geometry[k].y - sf.geometry[which].y;
double d1 = xd * xd + yd * yd;
double d2 = xd2 * xd2 + yd2 * yd2;
if (d1 != 0 && d2 != 0 &&
(d1 + d2 > far ||
((d1 + d2 == far) && (sf.geometry[k] < sf.geometry[which2])))) {
far = d1 + d2;
long long d = square_distance_from_line(sf.geometry[k].x, sf.geometry[k].y,
sf.geometry[i].x, sf.geometry[i].y,
sf.geometry[which].x, sf.geometry[which].y,
16);
if ((d > far) ||
((d == far) && (sf.geometry[k] < sf.geometry[which2]))) {
far = d;
which2 = k;
}
}