From 77f5e9677fead1d17c63f94db57bb8aafd5f5d1a Mon Sep 17 00:00:00 2001 From: Erica Fischer Date: Fri, 5 Apr 2024 12:42:53 -0700 Subject: [PATCH] Next step of index widening; tests still pass --- geometry.cpp | 2 +- main.cpp | 2 +- projection.cpp | 34 +++++++++++++++++----------------- projection.hpp | 12 ++++++------ unit.cpp | 2 +- 5 files changed, 26 insertions(+), 26 deletions(-) diff --git a/geometry.cpp b/geometry.cpp index 89cfed7a..ec411980 100644 --- a/geometry.cpp +++ b/geometry.cpp @@ -1299,7 +1299,7 @@ drawvec checkerboard_anchors(drawvec const &geom, int tx, int ty, int z, unsigne drawvec out; // anchor point in world coordinates - unsigned wx, wy; + unsigned long long wx, wy; decode_index(label_point, &wx, &wy); long long wwx = decoded_to_coordinate(wx); diff --git a/main.cpp b/main.cpp index c569c8f6..1a451fa3 100644 --- a/main.cpp +++ b/main.cpp @@ -2508,7 +2508,7 @@ std::pair read_input(std::vector &sources, char *fname, i long long ip; for (ip = 0; ip < indices; ip++) { - unsigned xx, yy; + unsigned long long xx, yy; decode_index(map[ip].ix, &xx, &yy); long long gxx = decoded_to_coordinate(xx); diff --git a/projection.cpp b/projection.cpp index 194b25ee..99784707 100644 --- a/projection.cpp +++ b/projection.cpp @@ -9,8 +9,8 @@ #define UINT_BITS 32 -index_t (*encode_index)(unsigned int wx, unsigned int wy) = NULL; -void (*decode_index)(index_t index, unsigned *wx, unsigned *wy) = NULL; +index_t (*encode_index)(unsigned long long wx, unsigned long long wy) = NULL; +void (*decode_index)(index_t index, unsigned long long *wx, unsigned long long *wy) = NULL; struct projection projections[] = { {"EPSG:4326", lonlat2tile, tile2lonlat, "urn:ogc:def:crs:OGC:1.3:CRS84"}, @@ -107,7 +107,7 @@ void tiletoepsg3857(long long ix, long long iy, int zoom, double *ox, double *oy // https://en.wikipedia.org/wiki/Hilbert_curve -void hilbert_rot(unsigned long long n, unsigned *x, unsigned *y, unsigned long long rx, unsigned long long ry) { +void hilbert_rot(unsigned long long n, unsigned long long *x, unsigned long long *y, unsigned long long rx, unsigned long long ry) { if (ry == 0) { if (rx == 1) { *x = n - 1 - *x; @@ -120,11 +120,11 @@ void hilbert_rot(unsigned long long n, unsigned *x, unsigned *y, unsigned long l } } -unsigned long long hilbert_xy2d(unsigned long long n, unsigned x, unsigned y) { - unsigned long long d = 0; +index_t hilbert_xy2d(unsigned long long n, unsigned long long x, unsigned long long y) { + index_t d = 0; unsigned long long rx, ry; - for (unsigned long long s = n / 2; s > 0; s /= 2) { + for (index_t s = n / 2; s > 0; s /= 2) { rx = (x & s) != 0; ry = (y & s) != 0; @@ -135,12 +135,12 @@ unsigned long long hilbert_xy2d(unsigned long long n, unsigned x, unsigned y) { return d; } -void hilbert_d2xy(unsigned long long n, unsigned long long d, unsigned *x, unsigned *y) { +void hilbert_d2xy(index_t n, index_t d, unsigned long long *x, unsigned long long *y) { unsigned long long rx, ry; - unsigned long long t = d; + index_t t = d; *x = *y = 0; - for (unsigned long long s = 1; s < n; s *= 2) { + for (index_t s = 1; s < n; s *= 2) { rx = 1 & (t / 2); ry = 1 & (t ^ rx); hilbert_rot(s, x, y, rx, ry); @@ -150,20 +150,20 @@ void hilbert_d2xy(unsigned long long n, unsigned long long d, unsigned *x, unsig } } -index_t encode_hilbert(unsigned int wx, unsigned int wy) { +index_t encode_hilbert(unsigned long long wx, unsigned long long wy) { return hilbert_xy2d(1LL << UINT_BITS, wx, wy); } -void decode_hilbert(index_t index, unsigned *wx, unsigned *wy) { +void decode_hilbert(index_t index, unsigned long long *wx, unsigned long long *wy) { hilbert_d2xy(1LL << UINT_BITS, index, wx, wy); } -index_t encode_quadkey(unsigned int wx, unsigned int wy) { - unsigned long long out = 0; +index_t encode_quadkey(unsigned long long wx, unsigned long long wy) { + index_t out = 0; int i; for (i = 0; i < UINT_BITS; i++) { - unsigned long long v = ((wx >> (UINT_BITS - (i + 1))) & 1) << 1; + index_t v = ((wx >> (UINT_BITS - (i + 1))) & 1) << 1; v |= (wy >> (UINT_BITS - (i + 1))) & 1; v = v << (64 - 2 * (i + 1)); @@ -176,7 +176,7 @@ index_t encode_quadkey(unsigned int wx, unsigned int wy) { static std::atomic decodex[256]; static std::atomic decodey[256]; -void decode_quadkey(index_t index, unsigned *wx, unsigned *wy) { +void decode_quadkey(index_t index, unsigned long long *wx, unsigned long long *wy) { static std::atomic initialized(0); if (!initialized) { for (size_t ix = 0; ix < 256; ix++) { @@ -197,8 +197,8 @@ void decode_quadkey(index_t index, unsigned *wx, unsigned *wy) { *wx = *wy = 0; for (size_t i = 0; i < 8; i++) { - *wx |= ((unsigned) decodex[(index >> (8 * i)) & 0xFF]) << (4 * i); - *wy |= ((unsigned) decodey[(index >> (8 * i)) & 0xFF]) << (4 * i); + *wx |= ((unsigned long long) decodex[(index >> (8 * i)) & 0xFF]) << (4 * i); + *wy |= ((unsigned long long) decodey[(index >> (8 * i)) & 0xFF]) << (4 * i); } } diff --git a/projection.hpp b/projection.hpp index 9c7e8bfd..6bb83824 100644 --- a/projection.hpp +++ b/projection.hpp @@ -20,14 +20,14 @@ struct projection { extern struct projection *projection; extern struct projection projections[]; -extern index_t (*encode_index)(unsigned int wx, unsigned int wy); -extern void (*decode_index)(index_t index, unsigned *wx, unsigned *wy); +extern index_t (*encode_index)(unsigned long long wx, unsigned long long wy); +extern void (*decode_index)(index_t index, unsigned long long *wx, unsigned long long *wy); -index_t encode_quadkey(unsigned int wx, unsigned int wy); -void decode_quadkey(index_t index, unsigned *wx, unsigned *wy); +index_t encode_quadkey(unsigned long long wx, unsigned long long wy); +void decode_quadkey(index_t index, unsigned long long *wx, unsigned long long *wy); -index_t encode_hilbert(unsigned int wx, unsigned int wy); -void decode_hilbert(index_t index, unsigned *wx, unsigned *wy); +index_t encode_hilbert(unsigned long long wx, unsigned long long wy); +void decode_hilbert(index_t index, unsigned long long *wx, unsigned long long *wy); unsigned coordinate_to_encodable(long long coord); long long decoded_to_coordinate(unsigned coord); diff --git a/unit.cpp b/unit.cpp index 1cd685c3..d282eaf5 100644 --- a/unit.cpp +++ b/unit.cpp @@ -127,7 +127,7 @@ TEST_CASE("Quadkey index", "quadkey index") { unsigned x = (unsigned) 1234567890; unsigned y = (unsigned) 3210987654; index_t encoded; - unsigned nx, ny; + unsigned long long nx, ny; encoded = encode_quadkey(x, y); REQUIRE((unsigned long long) encoded == 7338499239188161052);