From d4785cda14d3f6906f47b3471f33534b57554eea Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sun, 12 Aug 2018 23:37:48 +0300 Subject: [PATCH] added CompactedCoords util --- .../java/mc/core/utils/CompactedCoords.java | 23 ++++++++++ .../mc/core/utils/TestCompactedCoords.java | 45 +++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 core/src/main/java/mc/core/utils/CompactedCoords.java create mode 100644 core/src/test/java/mc/core/utils/TestCompactedCoords.java diff --git a/core/src/main/java/mc/core/utils/CompactedCoords.java b/core/src/main/java/mc/core/utils/CompactedCoords.java new file mode 100644 index 0000000..8a33b41 --- /dev/null +++ b/core/src/main/java/mc/core/utils/CompactedCoords.java @@ -0,0 +1,23 @@ +package mc.core.utils; + +import lombok.extern.slf4j.Slf4j; + +@Slf4j +public class CompactedCoords { + public static int compressXZ(int x, int z) { + if (x < Short.MIN_VALUE || x > Short.MAX_VALUE || + z < Short.MIN_VALUE || z > Short.MAX_VALUE) { + log.warn("Coord over range: [{},{}]", x, z); + } + + return ((x & 0xFFFF) << 16) | (z & 0xFFFF); + } + + public static int[] uncompressXZ(int compactValue) { + //TODO не нравится мне такие костыли + return new int[]{ + (int)(short) (compactValue >> 16), + (int)(short) (compactValue | 0xFFFF0000) + }; + } +} diff --git a/core/src/test/java/mc/core/utils/TestCompactedCoords.java b/core/src/test/java/mc/core/utils/TestCompactedCoords.java new file mode 100644 index 0000000..4150c53 --- /dev/null +++ b/core/src/test/java/mc/core/utils/TestCompactedCoords.java @@ -0,0 +1,45 @@ +package mc.core.utils; + +import org.junit.Assert; +import org.junit.Test; + +import java.util.Random; + + +public class TestCompactedCoords { + @Test + public void testSimple() { + for (int z = -100; z <= 100; z++) { + for (int x = -100; x <= 100; x++) { + int compressXZ = CompactedCoords.compressXZ(x, z); + int[] xz = CompactedCoords.uncompressXZ(compressXZ); + + Assert.assertEquals(x, xz[0]); + Assert.assertEquals(z, xz[1]); + } + } + } + + @Test + public void testRandom() { + Random random = new Random(); + int x,z; + + for (int i = 0; i < 100; i++) { + do { + x = random.nextInt(); + } while (x < Short.MIN_VALUE || x > Short.MAX_VALUE); + + do { + z = random.nextInt(); + } while (z < Short.MIN_VALUE || z > Short.MAX_VALUE); + + + int compressXZ = CompactedCoords.compressXZ(x, z); + int[] xz = CompactedCoords.uncompressXZ(compressXZ); + + Assert.assertEquals(x, xz[0]); + Assert.assertEquals(z, xz[1]); + } + } +}