Beispiel #1
0
        public void IsInsideBoxTest()
        {
            ulong min = ZCurve.Encode(1U, 1U);             // 3
            ulong max = ZCurve.Encode(5U, 4U);             // 49

            Assert.False(ZCurve.IsInsideBox(0, min, max));
            Assert.True(ZCurve.IsInsideBox(3, min, max));
            Assert.True(ZCurve.IsInsideBox(19, min, max));
            Assert.False(ZCurve.IsInsideBox(20, min, max));
            Assert.False(ZCurve.IsInsideBox(8, min, max));
            Assert.True(ZCurve.IsInsideBox(15, min, max));
            Assert.True(ZCurve.IsInsideBox(49, min, max));
            Assert.False(ZCurve.IsInsideBox(50, min, max));

            min = ZCurve.Encode(int.MaxValue - 1, int.MaxValue - 1);
            max = ZCurve.Encode(int.MaxValue, int.MaxValue);
            Assert.False(ZCurve.IsInsideBox(ZCurve.Encode(int.MaxValue - 2, int.MaxValue - 2), min, max));
            Assert.True(ZCurve.IsInsideBox(ZCurve.Encode(int.MaxValue - 1, int.MaxValue - 1), min, max));
            Assert.True(ZCurve.IsInsideBox(ZCurve.Encode(int.MaxValue, int.MaxValue), min, max));
            Assert.False(ZCurve.IsInsideBox(ZCurve.Encode(1U + int.MaxValue, 1U + int.MaxValue), min, max));
        }
Beispiel #2
0
        public void NearestAboveTest()
        {
            Assert.Equal(1UL, ZCurve.NearestAbove(0, 0));
            Assert.Equal(2UL, ZCurve.NearestAbove(0, 1));
            Assert.Equal(4UL, ZCurve.NearestAbove(0, 2));
            Assert.Equal(8UL, ZCurve.NearestAbove(0, 3));
            Assert.Equal(1UL << 31, ZCurve.NearestAbove(0, 31));
            Assert.Equal(1UL << 63, ZCurve.NearestAbove(0, 63));

            Assert.Equal(3UL, ZCurve.NearestAbove(3, 0));
            Assert.Equal(3UL, ZCurve.NearestAbove(3, 1));
            Assert.Equal(6UL, ZCurve.NearestAbove(3, 2));
            Assert.Equal(9UL, ZCurve.NearestAbove(3, 3));
            Assert.Equal(18UL, ZCurve.NearestAbove(3, 4));
            Assert.Equal(66UL, ZCurve.NearestAbove(3, 6));
            Assert.Equal(129UL, ZCurve.NearestAbove(3, 7));
            Assert.Equal((1UL << 31) + 1, ZCurve.NearestAbove(3, 31));
            Assert.Equal((1UL << 63) + 1, ZCurve.NearestAbove(3, 63));

            // TODO More
        }
Beispiel #3
0
        public void QueryBlocksTrial()
        {
            // Expect shortest ordered sequence of blocks covering query box

            // Query box:
            ulong qlo = ZCurve.Encode(1U, 1U);             // 3
            ulong qhi = ZCurve.Encode(5U, 4U);             // 49

            // Expected result: 3 6 7 9 11 (12..15) 18 19 (24..27) 33 36 37 48 49
            var starts   = new ulong[] { 3, 6, 7, 9, 11, 12, 18, 19, 24, 33, 36, 37, 48, 49 };
            var levels   = new[] { 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0 };
            var expected = starts.Zip(levels, (s, l) => new ZCurve.Block(s, l)).ToList();
            var actual   = new List <ZCurve.Block>();

            ulong first = ZCurve.FirstInBlock(qlo, 0);
            ulong last  = ZCurve.FirstInBlock(qhi, 0);

            for (ulong cursor = first; ;)
            {
                int   level     = ZCurve.LargestLevel(cursor, last);
                ulong increment = ZCurve.CellsPerBlock(level);

                actual.Add(new ZCurve.Block(cursor, level));

                cursor += increment;

                if (cursor > last)
                {
                    break;
                }

                if (!ZCurve.IsInsideBox(cursor, first, last))
                {
                    cursor = ZCurve.NextInsideBox(cursor, first, last);
                }
            }

            Assert.Equal(expected, actual);
        }
Beispiel #4
0
        public void LargestLevel3Test()
        {
            var levels12 = new[] { 1, 2 };

            Assert.Equal(1, ZCurve.LargestLevel(48, 48, levels12));
            Assert.Equal(1, ZCurve.LargestLevel(60, 48, levels12));

            Assert.Equal(2, ZCurve.LargestLevel(0, 49, levels12));
            Assert.Equal(1, ZCurve.LargestLevel(1, 49, levels12));
            Assert.Equal(1, ZCurve.LargestLevel(2, 49, levels12));
            Assert.Equal(1, ZCurve.LargestLevel(3, 49, levels12));
            Assert.Equal(1, ZCurve.LargestLevel(4, 49, levels12));
            Assert.Equal(1, ZCurve.LargestLevel(5, 49, levels12));

            Assert.Equal(1, ZCurve.LargestLevel(48, 49, levels12));
            Assert.Equal(2, ZCurve.LargestLevel(48, 63, levels12));

            var levels24 = new[] { 2, 4 };

            Assert.Equal(4, ZCurve.LargestLevel(0, 768, levels24));
            Assert.Equal(2, ZCurve.LargestLevel(128, 768, levels24));
            Assert.Equal(2, ZCurve.LargestLevel(31, 31, levels24));
        }
Beispiel #5
0
        public void NearestBelowTest()
        {
            Assert.Equal(0UL, ZCurve.NearestBelow(0, 0));
            Assert.Equal(0UL, ZCurve.NearestBelow(0, 1));
            Assert.Equal(1UL, ZCurve.NearestBelow(0, 2));
            Assert.Equal(2UL, ZCurve.NearestBelow(0, 3));
            Assert.Equal(0x2AAAAAAAUL, ZCurve.NearestBelow(0, 31));
            Assert.Equal(0x2AAAAAAAAAAAAAAAUL, ZCurve.NearestBelow(0, 63));

            // 55 = Z(7,5) // 0111b 0101b => 0011 0111b
            Assert.Equal(54UL, ZCurve.NearestBelow(55, 0));
            Assert.Equal(53UL, ZCurve.NearestBelow(55, 1));
            Assert.Equal(51UL, ZCurve.NearestBelow(55, 2));
            Assert.Equal(55UL, ZCurve.NearestBelow(55, 3));
            Assert.Equal(39UL, ZCurve.NearestBelow(55, 4));
            Assert.Equal(31UL, ZCurve.NearestBelow(55, 5));
            Assert.Equal(55UL, ZCurve.NearestBelow(55, 6));
            Assert.Equal(63UL, ZCurve.NearestBelow(55, 7));
            Assert.Equal(ZCurve.Encode(7, 0x7FFF), ZCurve.NearestBelow(55, 31));
            Assert.Equal(ZCurve.Encode(7, int.MaxValue), ZCurve.NearestBelow(55, 63));

            // TODO More
        }
Beispiel #6
0
        public void LastInBlockTest()
        {
            Assert.Equal(0UL, ZCurve.LastInBlock(0, 0));
            Assert.Equal(1UL, ZCurve.LastInBlock(1, 0));
            Assert.Equal(2UL, ZCurve.LastInBlock(2, 0));
            Assert.Equal(3UL, ZCurve.LastInBlock(3, 0));
            Assert.Equal(4UL, ZCurve.LastInBlock(4, 0));
            Assert.Equal(256UL, ZCurve.LastInBlock(256, 0));
            Assert.Equal(ulong.MaxValue, ZCurve.LastInBlock(ulong.MaxValue, 0));

            Assert.Equal(3UL, ZCurve.LastInBlock(0, 1));
            Assert.Equal(15UL, ZCurve.LastInBlock(0, 2));
            Assert.Equal(63UL, ZCurve.LastInBlock(0, 3));
            Assert.Equal(255UL, ZCurve.LastInBlock(0, 4));
            Assert.Equal(65535UL, ZCurve.LastInBlock(0, 8));
            Assert.Equal(0x3FFFFFFFFFFFFFFFUL, ZCurve.LastInBlock(0, 31));
            Assert.Equal(ulong.MaxValue, ZCurve.LastInBlock(0, 32));

            Assert.Equal(15UL, ZCurve.LastInBlock(1, 2));

            Assert.Equal(0x3FFFFFFFFFFFFFFFUL, ZCurve.LastInBlock(0, 31));
            Assert.Equal(0x7FFFFFFFFFFFFFFFUL, ZCurve.LastInBlock(1L << 62, 31));
            Assert.Equal(0xFFFFFFFFFFFFFFFFUL, ZCurve.LastInBlock(0, 32));
        }
Beispiel #7
0
 /// <summary>
 /// Hashing for dictionary using ZCurves
 /// </summary>
 public override int GetHashCode()
 {
     System.Diagnostics.Debug.Assert(RealPoint.Z >= 0 && RealPoint.X >= 0);
     return((int)ZCurve.Pos2D((uint)RealPoint.Z, (uint)RealPoint.X));
 }