public void SortHilbertTestSteps4() { var n = 4; // build locations. var locations = new List <Coordinate>(); locations.Add(new Coordinate(-90, -180)); locations.Add(new Coordinate(-90, -60)); locations.Add(new Coordinate(-90, 60)); locations.Add(new Coordinate(-90, 180)); locations.Add(new Coordinate(-30, -180)); locations.Add(new Coordinate(-30, -60)); locations.Add(new Coordinate(-30, 60)); locations.Add(new Coordinate(-30, 180)); locations.Add(new Coordinate(30, -180)); locations.Add(new Coordinate(30, -60)); locations.Add(new Coordinate(30, 60)); locations.Add(new Coordinate(30, 180)); locations.Add(new Coordinate(90, -180)); locations.Add(new Coordinate(90, -60)); locations.Add(new Coordinate(90, 60)); locations.Add(new Coordinate(90, 180)); // build db. var stops = new StopsDb(); for (var stop = 0; stop < locations.Count; stop++) { stops.Add((float)locations[stop].Latitude, (float)locations[stop].Longitude, (uint)stop); } // build a sorted version in-place. stops.Sort(null); // test if sorted. var stopsDbEnumerator = stops.GetEnumerator(); for (uint stop = 1; stop < stops.Count - 1; stop++) { Assert.IsTrue( stopsDbEnumerator.Distance(n, stop) <= stopsDbEnumerator.Distance(n, stop + 1)); } // sort locations. locations.Sort((x, y) => { return(HilbertCurve.HilbertDistance((float)x.Latitude, (float)x.Longitude, n).CompareTo( HilbertCurve.HilbertDistance((float)y.Latitude, (float)y.Longitude, n))); }); // confirm sort. for (uint stop = 0; stop < stops.Count; stop++) { stopsDbEnumerator.MoveTo(stop); Assert.AreEqual(stopsDbEnumerator.Latitude, locations[(int)stop].Latitude); Assert.AreEqual(stopsDbEnumerator.Longitude, locations[(int)stop].Longitude); } }
public void SortHilbertTestSteps4() { var n = 4; // build locations. var locations = new List <Coordinate>(); locations.Add(new Coordinate(-90, -180)); locations.Add(new Coordinate(-90, -60)); locations.Add(new Coordinate(-90, 60)); locations.Add(new Coordinate(-90, 180)); locations.Add(new Coordinate(-30, -180)); locations.Add(new Coordinate(-30, -60)); locations.Add(new Coordinate(-30, 60)); locations.Add(new Coordinate(-30, 180)); locations.Add(new Coordinate(30, -180)); locations.Add(new Coordinate(30, -60)); locations.Add(new Coordinate(30, 60)); locations.Add(new Coordinate(30, 180)); locations.Add(new Coordinate(90, -180)); locations.Add(new Coordinate(90, -60)); locations.Add(new Coordinate(90, 60)); locations.Add(new Coordinate(90, 180)); // build graph. var graph = new GeometricGraph(1); for (var vertex = 0; vertex < locations.Count; vertex++) { graph.AddVertex((uint)vertex, locations[vertex].Latitude, locations[vertex].Longitude); } // build a sorted version in-place. graph.Sort(n); // test if sorted. for (uint vertex = 1; vertex < graph.VertexCount - 1; vertex++) { Assert.IsTrue( graph.Distance(n, vertex) <= graph.Distance(n, vertex + 1)); } // sort locations. locations.Sort((x, y) => { return(HilbertCurve.HilbertDistance(x.Latitude, x.Longitude, n).CompareTo( HilbertCurve.HilbertDistance(y.Latitude, y.Longitude, n))); }); // confirm sort. for (uint vertex = 0; vertex < graph.VertexCount; vertex++) { float latitude, longitude; graph.GetVertex(vertex, out latitude, out longitude); Assert.AreEqual(latitude, locations[(int)vertex].Latitude); Assert.AreEqual(longitude, locations[(int)vertex].Longitude); } }
public void TestHilbertDistance2() { Assert.AreEqual(0, HilbertCurve.HilbertDistance(-45, -90, 2)); Assert.AreEqual(1, HilbertCurve.HilbertDistance(+45, -90, 2)); Assert.AreEqual(2, HilbertCurve.HilbertDistance(+45, +90, 2)); Assert.AreEqual(3, HilbertCurve.HilbertDistance(-45, +90, 2)); }
/// <summary> /// Returns the hibert distance for n and the given stop. /// </summary> /// <returns></returns> public static long Distance(this StopsDb.Enumerator stopsDbEnumerator, int n, uint stop) { if (!stopsDbEnumerator.MoveTo(stop)) { throw new Exception(string.Format("Cannot calculate hilbert distance, stop {0} does not exist.", stop)); } return(HilbertCurve.HilbertDistance(stopsDbEnumerator.Latitude, stopsDbEnumerator.Longitude, n)); }
public static long Distance(this RoutingNetwork graph, int n, uint vertex) { float latitude; float longitude; if (!graph.GetVertex(vertex, out latitude, out longitude)) { throw new Exception(string.Format("Cannot calculate hilbert distance, vertex {0} does not exist.", (object)vertex)); } return(HilbertCurve.HilbertDistance(latitude, longitude, (long)n)); }
/// <summary> /// Returns the hibert distance for n and the given vertex. /// </summary> /// <typeparam name="TEdgeData"></typeparam> /// <param name="graph"></param> /// <param name="n"></param> /// <param name="vertex"></param> /// <returns></returns> public static long HilbertDistance <TEdgeData>(this GraphBase <TEdgeData> graph, int n, uint vertex) where TEdgeData : struct, IGraphEdgeData { float latitude, longitude; if (!graph.GetVertex(vertex, out latitude, out longitude)) { throw new Exception(string.Format("Vertex {0} does not exist in graph.", vertex)); } return(HilbertCurve.HilbertDistance(latitude, longitude, n)); }
/// <summary> /// Returns all hibert distances for n. /// </summary> /// <typeparam name="TEdgeData"></typeparam> /// <returns></returns> public static long[] HilbertDistances <TEdgeData>(this GraphBase <TEdgeData> graph, int n) where TEdgeData : struct, IGraphEdgeData { var distances = new long[graph.VertexCount]; for (uint vertex = 1; vertex <= graph.VertexCount; vertex++) { float latitude, longitude; graph.GetVertex(vertex, out latitude, out longitude); distances[vertex - 1] = HilbertCurve.HilbertDistance(latitude, longitude, n); } return(distances); }
public void TestHilbertDistance4() { Assert.AreEqual(0, HilbertCurve.HilbertDistance(-90 + (45 * 0) + 25.5f, -180 + (90 * 0) + 45f, 4)); Assert.AreEqual(1, HilbertCurve.HilbertDistance(-90 + (45 * 0) + 25.5f, -180 + (90 * 1) + 45f, 4)); Assert.AreEqual(2, HilbertCurve.HilbertDistance(-90 + (45 * 1) + 25.5f, -180 + (90 * 1) + 45f, 4)); Assert.AreEqual(3, HilbertCurve.HilbertDistance(-90 + (45 * 1) + 25.5f, -180 + (90 * 0) + 45f, 4)); Assert.AreEqual(4, HilbertCurve.HilbertDistance(-90 + (45 * 2) + 25.5f, -180 + (90 * 0) + 45f, 4)); Assert.AreEqual(5, HilbertCurve.HilbertDistance(-90 + (45 * 3) + 25.5f, -180 + (90 * 0) + 45f, 4)); Assert.AreEqual(6, HilbertCurve.HilbertDistance(-90 + (45 * 3) + 25.5f, -180 + (90 * 1) + 45f, 4)); Assert.AreEqual(7, HilbertCurve.HilbertDistance(-90 + (45 * 2) + 25.5f, -180 + (90 * 1) + 45f, 4)); Assert.AreEqual(8, HilbertCurve.HilbertDistance(-90 + (45 * 2) + 25.5f, -180 + (90 * 2) + 45f, 4)); Assert.AreEqual(9, HilbertCurve.HilbertDistance(-90 + (45 * 3) + 25.5f, -180 + (90 * 2) + 45f, 4)); Assert.AreEqual(10, HilbertCurve.HilbertDistance(-90 + (45 * 3) + 25.5f, -180 + (90 * 3) + 45f, 4)); Assert.AreEqual(11, HilbertCurve.HilbertDistance(-90 + (45 * 2) + 25.5f, -180 + (90 * 3) + 45f, 4)); Assert.AreEqual(12, HilbertCurve.HilbertDistance(-90 + (45 * 1) + 25.5f, -180 + (90 * 3) + 45f, 4)); Assert.AreEqual(13, HilbertCurve.HilbertDistance(-90 + (45 * 1) + 25.5f, -180 + (90 * 2) + 45f, 4)); Assert.AreEqual(14, HilbertCurve.HilbertDistance(-90 + (45 * 0) + 25.5f, -180 + (90 * 2) + 45f, 4)); Assert.AreEqual(15, HilbertCurve.HilbertDistance(-90 + (45 * 0) + 25.5f, -180 + (90 * 3) + 45f, 4)); }
public void TestSorting() { // build locations. var locations = new List <Coordinate>(); locations.Add(new Coordinate(-90, -180)); locations.Add(new Coordinate(-90, -60)); locations.Add(new Coordinate(-90, 60)); locations.Add(new Coordinate(-90, 180)); locations.Add(new Coordinate(-30, -180)); locations.Add(new Coordinate(-30, -60)); locations.Add(new Coordinate(-30, 60)); locations.Add(new Coordinate(-30, 180)); locations.Add(new Coordinate(30, -180)); locations.Add(new Coordinate(30, -60)); locations.Add(new Coordinate(30, 60)); locations.Add(new Coordinate(30, 180)); locations.Add(new Coordinate(90, -180)); locations.Add(new Coordinate(90, -60)); locations.Add(new Coordinate(90, 60)); locations.Add(new Coordinate(90, 180)); // build db. var db = new StopsDb(locations.Count); for (var stop = 0; stop < locations.Count; stop++) { db.Add((float)locations[stop].Latitude, (float)locations[stop].Longitude, (uint)(stop * 2)); } // build a sorted version in-place. db.Sort(null); // test if sorted. var enumerator = db.GetEnumerator(); for (var stop = 1; stop < locations.Count; stop++) { enumerator.MoveTo((uint)stop - 1); var latitude1 = enumerator.Latitude; var longitude1 = enumerator.Longitude; enumerator.MoveTo((uint)stop); var latitude2 = enumerator.Latitude; var longitude2 = enumerator.Longitude; Assert.IsTrue( HilbertCurve.HilbertDistance(latitude1, longitude1, HilbertExtensions.DefaultHilbertSteps) <= HilbertCurve.HilbertDistance(latitude2, longitude2, HilbertExtensions.DefaultHilbertSteps)); } // sort locations. locations.Sort((x, y) => { return(HilbertCurve.HilbertDistance(x.Latitude, x.Longitude, HilbertExtensions.DefaultHilbertSteps).CompareTo( HilbertCurve.HilbertDistance(y.Latitude, y.Longitude, HilbertExtensions.DefaultHilbertSteps))); }); // confirm sort. enumerator = db.GetEnumerator(); for (var stop = 0; stop < locations.Count; stop++) { enumerator.MoveTo((uint)stop); Assert.AreEqual(enumerator.Latitude, locations[(int)stop].Latitude); Assert.AreEqual(enumerator.Longitude, locations[(int)stop].Longitude); } }