public void TestAddRange() { var sites = new[] { new Site { Point = new Point { X = 1, Y = 2 } }, new Site { Point = new Point { X = 1, Y = 1 } }, new Site { Point = new Point { X = 3, Y = 2 } } }; var map = new VoronoiMap(); map.AddRange(sites); Assert.AreEqual(sites.Count(), map.Count()); }
public void TestToArray() { var sites = new IGeometry[] { new Site { Point = new Point { X = 40, Y = 60 } }, new Site { Point = new Point { X = 20, Y = 40 } }, new Site { Point = new Point { X = 60, Y = 40 } }, new HalfEdge(new Point { X = 30, Y = 50 }, new Point { X = 20, Y = 40 }, new Point { X = 40, Y = 60 }), new Vertex { Point = new Point { X = 40, Y = 40 } } }; var map = new VoronoiMap(); map.AddRange(sites); var result = map.ToArray(); Assert.IsNotNull(result); Assert.AreEqual(70, result.GetLength(0)); Assert.AreEqual(70, result.GetLength(1)); Assert.AreEqual(new Point { X = 40, Y = 60 }, result[45, 65].Point); Assert.AreEqual(new Point { X = 20, Y = 40 }, result[25, 45].Point); Assert.AreEqual(new Point { X = 60, Y = 40 }, result[65, 45].Point); Assert.AreEqual(new Point { X = 40, Y = 40 }, result[45, 45].Point); }
public VoronoiMap CreateVoronoiMap(int height, int width, IEnumerable <Site> sites) { if (sites == null) { throw new ArgumentNullException("sites"); } if (sites.GroupBy(s => s.Point).Count() != sites.Count()) { throw new ArgumentException("Multiple sites with the same coordinates passed!"); } var siteList = string.Join(", ", sites.Select(s => s.Point.ToString()).ToArray()); _logger.Log($"Create Voronoi map with sites: {siteList}"); _eventQueue = new EventQueue(); _beachLine = new BeachLine(height); var map = new VoronoiMap(); _eventQueue.Initialize(sites.Select(s => s.Point)); map.AddRange(sites.Cast <IGeometry>()); while (_eventQueue.HasEvents) { var sweepEvent = _eventQueue.GetNextEvent(); var siteEvent = sweepEvent as SiteEvent; if (siteEvent != null) { _logger.Log($"Sweepline SiteEvent: {siteEvent.Point}"); var halfEdges = _siteEventHandler.HandleEvent(siteEvent, _eventQueue, _beachLine); map.AddRange(halfEdges); foreach (var geo in halfEdges) { _logger.Log($"Add {geo}"); } continue; } var circleEvent = sweepEvent as CircleEvent; if (circleEvent == null) { throw new InvalidOperationException("SweepEvent is neither SiteEvent nor CircleEvent"); } //_logger.Log($"Sweepline CircleEvent: {circleEvent.Point} for arc {circleEvent.Arc.Site}"); var circleEventResult = _circleEventHandler.HandleEvent(circleEvent, _eventQueue, _beachLine); foreach (var geo in circleEventResult) { _logger.Log($"Add {geo}"); } // Add vertex and new half edge map.AddRange(circleEventResult); } _beachLine.FinishEdge(_beachLine.Root, width); //map.FinishEdges(width); map.ConnectEdges(); _logger.Log("Finished Voronoi map creation"); foreach (var edge in map.Where(g => g is HalfEdge).Cast <HalfEdge>()) { _logger.Log(edge.ToString()); } return(map); }