static void Main(string[] args) { VoronoiMain.main(new Point[] { new Point(-1, -1), new Point(1, -1) , new Point(-1, 1), new Point(1, 1) }); Console.ReadLine(); }
protected override void OnRender(DrawingContext drawingContext) { base.OnRender(drawingContext); var dc = drawingContext; if (plotter == null) { return; } if (Points == null) { return; } var transform = plotter.Transform; VoronoiMain.main(Points); var lines = Output.LineCollection.OrderBy(line => line.EdgeNumber).ToArray(); var vertices = Output.VertexCollection.OrderBy(vertex => vertex.SiteNumber).ToArray(); var endPoints = Output.EndPointCollection.OrderBy(edge => edge.edgeNumber).ToArray(); Pen linePen = new Pen(Brushes.Black, 1); var segments = new List <Segment>(); for (int i = 0; i < endPoints.Length; i++) { var endPoint = endPoints[i]; var vertexId = endPoint.edgeNumber; var line = lines[vertexId]; var leftId = endPoint.EndPoints[0] != null ? endPoint.EndPoints[0].SiteNumber : -1; var rightId = endPoint.EndPoints[1] != null ? endPoint.EndPoints[1].SiteNumber : -1; Point pLeft = new Point(); Point pRight = new Point(); // at least one endPointId will be != -1 if (rightId == -1) { pLeft = GetSegmentCoordinate(vertices, line, leftId, new Point()); pRight = GetSegmentCoordinate(vertices, line, rightId, pLeft); segments.Add(new Segment { Start = pLeft, End = pRight, InfinityPoint = InfinityPoint.End, Site1 = line.Site1, Site2 = line.Site2 }); } else if (leftId == -1) { pRight = GetSegmentCoordinate(vertices, line, rightId, new Point()); pLeft = GetSegmentCoordinate(vertices, line, leftId, pRight); segments.Add(new Segment { Start = pRight, End = pLeft, InfinityPoint = InfinityPoint.End, Site1 = line.Site1, Site2 = line.Site2 }); } else // leftId != -1 && rightId != -1 { pLeft = GetSegmentCoordinate(vertices, line, leftId, new Point()); pRight = GetSegmentCoordinate(vertices, line, rightId, pLeft); segments.Add(new Segment { Start = pLeft, End = pRight, InfinityPoint = InfinityPoint.None, Site1 = line.Site1, Site2 = line.Site2 }); } pLeft = pLeft.DataToScreen(transform); pRight = pRight.DataToScreen(transform); dc.DrawLine(linePen, pLeft, pRight); } var pointsSequences = GetPointsSequences(segments); foreach (var sequence in pointsSequences) { var pathFigure = new PathFigure { IsClosed = true, IsFilled = true }; pathFigure.StartPoint = sequence.Points.First().DataToScreen(transform); pathFigure.Segments.Add(new PolyLineSegment(sequence.Points.Skip(1).DataToScreen(transform), false)); PathGeometry geometry = new PathGeometry(); geometry.Figures.Add(pathFigure); if (!brushes.ContainsKey(sequence.Site)) { brushes[sequence.Site] = ColorHelper.RandomBrush.MakeTransparent(0.5); } dc.DrawGeometry(brushes[sequence.Site], null, geometry); } }