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