Ejemplo n.º 1
0
        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());
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        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);
        }