public void LargeQuadtreeTest() { const int numPoints = 1000000; var random = new Random(); var timer = new Stopwatch(); // Build quadtree with numPoints points having // random x and y coordinates in the real interval: timer.Start(); var qt = new PointQuadtree <int>(); for (int id = 0; id < numPoints; id++) { double x = 100 * random.NextDouble(); double y = 100 * random.NextDouble(); qt.Add(id, new Point(x, y)); } timer.Stop(); _output.WriteLine("Built QT with {0:N0} random points in {1}", numPoints, timer.Elapsed); timer.Reset(); timer.Start(); var r1 = new List <int>(); int c1 = qt.Query(new Envelope(0, 0, 100, 100), null, r1); Assert.Equal(numPoints, c1); Assert.Equal(numPoints, r1.Count); timer.Stop(); _output.WriteLine("Queried world rectangle in {0}", timer.Elapsed); timer.Reset(); timer.Start(); int c2 = qt.Count(new Envelope(0, 0, 100, 100), null); Assert.Equal(numPoints, c2); timer.Stop(); _output.WriteLine("Counted world rectangle in {0}", timer.Elapsed); timer.Reset(); timer.Start(); var r3 = new List <int>(); int c3 = qt.Query(new Envelope(0, 0, 50, 50), null, r3); Assert.True(r3.Count == c3); timer.Stop(); _output.WriteLine("Queried SW quadrant ({0} points) in {1}", c3, timer.Elapsed); timer.Reset(); timer.Start(); int c4 = qt.Count(new Envelope(0, 0, 50, 50), null); timer.Stop(); _output.WriteLine("Counted SW quadrant ({0} points) in {1}", c4, timer.Elapsed); ShowStats(qt); }
public void CanHandleCoincidentPoints() { var qt = new PointQuadtree <Place>(); qt.Add(Chicago, Chicago.Point); qt.Add(Chicago, Chicago.Point); // again string serializedQuadtree = GetSerializedQuadtree(qt); Assert.Equal("(Chicago (Chicago ....)...)", serializedQuadtree); var r1 = new List <Place>(); int c1 = qt.Query(new Envelope(0, 0, 100, 100), null, r1); Assert.Equal(2, c1); Assert.Equal(r1.OrderBy(p => p.Tag), Seq(Chicago, Chicago)); var r2 = new List <Place>(); int c2 = qt.Query(new Envelope(Chicago.Point, Chicago.Point), null, r2); Assert.Equal(2, c2); Assert.Equal(r2.OrderBy(p => p.Tag), Seq(Chicago, Chicago)); qt.Add(Mobile, Mobile.Point); qt.Add(Mobile, Mobile.Point); // again var r3 = new List <Place>(); int c3 = qt.Query(new Envelope(Mobile.Point, Mobile.Point), null, r3); Assert.Equal(2, c3); Assert.Equal(r3.OrderBy(p => p.Tag), Seq(Mobile, Mobile)); var r4 = new List <Place>(); int c4 = qt.Query(new Envelope(Chicago.Point, Mobile.Point), null, r4); Assert.Equal(4, c4); Assert.Equal(r4.OrderBy(p => p.Tag), Seq(Chicago, Chicago, Mobile, Mobile)); serializedQuadtree = GetSerializedQuadtree(qt); Assert.Equal("(Chicago (Chicago ....)..(Mobile (Mobile ....)...))", serializedQuadtree); qt.Add(Toronto, Toronto.Point); qt.Add(Buffalo, Buffalo.Point); qt.Add(Denver, Denver.Point); qt.Add(Omaha, Omaha.Point); qt.Add(Atlanta, Atlanta.Point); qt.Add(Miami, Miami.Point); qt.Add(Memphis, Memphis.Point); qt.Add(Memphis, Memphis.Point); // again serializedQuadtree = GetSerializedQuadtree(qt); Assert.Equal( "(Chicago (Chicago (Toronto ...(Buffalo ....))...)(Denver ....)(Omaha ....)(Mobile (Mobile (Atlanta ....)...)(Memphis (Memphis ....)...).(Miami ....)))", serializedQuadtree); var r5 = new List <Place>(); int c5 = qt.Query(new Envelope(30, 5, 60, 25), null, r5); Assert.Equal(4, c5); Assert.Equal(r5.OrderBy(p => p.Tag), Seq(Memphis, Memphis, Mobile, Mobile)); ShowStats(qt); }