diff --git a/geometry.cpp b/geometry.cpp index ce59f867..01eb6be9 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -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) { diff --git a/geometry.hpp b/geometry.hpp index 23395b0f..2c40f0cc 100644 --- a/geometry.hpp +++ b/geometry.hpp @@ -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 const &keep); diff --git a/tile.cpp b/tile.cpp index 14a83f0e..084c7232 100644 --- a/tile.cpp +++ b/tile.cpp @@ -2329,16 +2329,13 @@ long long write_tile(decompressor *geoms, std::atomic *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; } }