Esempio n. 1
0
        public Image ComputeVoronoiMap(Image image, bool drawEdges)
        {
            if (image == null || this.points.Count <= 0)
            {
                return(null);
            }

            this.progress = 5;

            VoronoiGraph graph = Fortune.ComputeVoronoiGraph(this.points);

            Color[,] colors = Sampler.BitmapToColorArray((Bitmap)image);

            int width  = colors.GetLength(0) - 1;
            int height = colors.GetLength(1) - 1;

            image = (Image) new Bitmap(width + 1, height + 1);
            Graphics g = Graphics.FromImage(image);

            this.progress = 30;

            polygons = GetRegions(graph);

            this.progress = 92;

            foreach (scg.KeyValuePair <Vector, scg.List <PointF> > region in polygons)
            {
                Vector v  = region.Key;
                int    ix = Math.Min(Math.Max((int)Math.Round(v[0]), 0), width);
                int    iy = Math.Min(Math.Max((int)Math.Round(v[1]), 0), height);

                PointF[] ps = region.Value.ToArray();

                g.FillPolygon(new SolidBrush(colors[ix, iy]), ps, FillMode.Alternate);
            }

            g.Flush();

            this.image = image;

            this.progress = 95;

            if (drawEdges)
            {
                DrawEdges(image);
            }

            this.progress = 100;

            return(image);
        }
Esempio n. 2
0
        private scg.Dictionary <Vector, scg.List <PointF> > GetRegions(VoronoiGraph graph)
        {
            scg.Dictionary <Vector, scg.List <PointF> > output = new scg.Dictionary <Vector, scg.List <PointF> >();

            int i = 0;

            foreach (Vector v in this.points)
            {
                if (!output.ContainsKey(v))
                {
                    output.Add(v, new scg.List <PointF>());

                    foreach (VoronoiEdge edge in graph.Edges)
                    {
                        AddEdgeForVectorRegion(output, edge, v);
                    }
                }

                this.progress = 30 + (int)(((float)i / (float)this.points.Count) * 55f);

                i++;
            }

            scg.Dictionary <Vector, scg.List <PointF> > newOutput = new scg.Dictionary <Vector, scg.List <PointF> >();

            foreach (scg.KeyValuePair <Vector, scg.List <PointF> > region in output)
            {
                scg.List <WPointF> sort = SortRegion(region);

                newOutput.Add(region.Key, new scg.List <PointF>());

                foreach (WPointF pointf in sort)
                {
                    newOutput[region.Key].Add(pointf.point);
                }
            }

            output = newOutput;

            return(output);
        }
Esempio n. 3
0
        public void AddEdgeForVectorRegion(scg.Dictionary <Vector, scg.List <PointF> > output, VoronoiEdge edge, Vector vector)
        {
            PointF p  = new PointF((float)edge.VVertexA[0], (float)edge.VVertexA[1]);
            PointF p2 = new PointF((float)edge.VVertexB[0], (float)edge.VVertexB[1]);

            if (float.IsInfinity(p2.X))
            {
                p2.X = (float)edge.FixedPoint[0] + 1000f * (float)edge.DirectionVector[0];
            }

            if (float.IsInfinity(p2.Y))
            {
                p2.Y = (float)edge.FixedPoint[1] + 1000f * (float)edge.DirectionVector[1];
            }

            if (edge.LeftData.Equals(vector))
            {
                if (!output[vector].Contains(p))
                {
                    output[vector].Add(p);
                }

                if (!output[vector].Contains(p2))
                {
                    output[vector].Add(p2);
                }
            }

            if (edge.RightData.Equals(vector))
            {
                if (!output[vector].Contains(p))
                {
                    output[vector].Add(p);
                }

                if (!output[vector].Contains(p2))
                {
                    output[vector].Add(p2);
                }
            }
        }