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)); }
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 }
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); }
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)); }
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 }
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)); }
/// <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)); }