Ejemplo n.º 1
0
        public static VoronoiGraph ErosionVG(VoronoiGraph VGOriginal, VoronoiGraph VGCurrent, ref List <Node> VGVertizes)
        {
            VoronoiGraph VGErg                = VGCurrent.Clone();
            List <int>   VGErgExclude         = new List <int>();
            List <Node>  VGErgNeigbourExclude = new List <Node>();

            foreach (Node VGVertize in VGVertizes)
            {
                if (Math.Abs(VGVertize.Orientation) < 0.1)
                {
                    Vector vgv = new Vector(VGVertize.X, VGVertize.Y);
                    int    i   = 0;
                    foreach (VoronoiEdge VE in VGOriginal.Edges)
                    {
                        if (VE.LeftData.Equals(vgv))
                        {
                            VGErg.Edges.Remove(VE);
                            if (!VGErgExclude.Contains(i))
                            {
                                VGErgExclude.Add(i);
                                VGErgNeigbourExclude.Add(new Node("", VE.RightData[0], VE.RightData[1], 0));
                                //break;
                            }
                        }
                        else if (VE.RightData.Equals(vgv))
                        {
                            VGErg.Edges.Remove(VE);
                            if (!VGErgExclude.Contains(i))
                            {
                                VGErgExclude.Add(i);
                                VGErgNeigbourExclude.Add(new Node("", VE.LeftData[0], VE.LeftData[1], 0));
                                //break;
                            }
                        }
                        i++;
                    }
                }
            }

            foreach (Node VGVertize in VGVertizes)
            {
                if (Math.Abs(VGVertize.Orientation) >= 0.1)
                {
                    foreach (Node VGVN in VGErgNeigbourExclude)
                    {
                        if (Math.Abs(VGVertize.X - VGVN.X) <= 1e-10 && Math.Abs(VGVertize.Y - VGVN.Y) <= 1e-10)
                        {
                            VGVertize.Orientation = VGVN.Orientation;
                            break;
                        }
                    }
                }
            }

            return(VGErg);
        }
Ejemplo n.º 2
0
        public static VoronoiGraph DilationVG(VoronoiGraph VGOriginal, VoronoiGraph VGCurrent, ref List <Node> VGVertizes)
        {
            VoronoiGraph VGErg          = VGCurrent.Clone();
            List <Node>  VGVertizesCopy = new List <Node>();

            foreach (Node node in VGVertizes)
            {
                VGVertizesCopy.Add(new Node(node.Id, node.X, node.Y, node.Orientation));
            }

            if (VGCurrent.Edges.Count < VGOriginal.Edges.Count)
            {
                foreach (Node VGVertize in VGVertizes)
                {
                    if (Math.Abs(VGVertize.Orientation) >= 0.1)
                    {
                        Vector vgv = new Vector(VGVertize.X, VGVertize.Y);
                        foreach (VoronoiEdge VE in VGOriginal.Edges)
                        {
                            if (VE.LeftData.Equals(vgv))
                            {
                                bool EdgeFound = false;
                                foreach (Node VGVertizeCopy in VGVertizesCopy)
                                {
                                    if ((Math.Abs(VGVertizeCopy.Orientation) < 0.1 || Math.Abs(VGVertizeCopy.Orientation) >= 0.1) && Math.Abs(VGVertizeCopy.X - VE.RightData[0]) <= 1e-10 && Math.Abs(VGVertizeCopy.Y - VE.RightData[1]) <= 1e-10)
                                    {
                                        VGVertizeCopy.Orientation = 1;
                                        if (!VGErg.Edges.Contains(VE))
                                        {
                                            VGErg.Edges.Add(VE);
                                            EdgeFound = true;
                                        }
                                        //break;
                                    }
                                }
                                if (EdgeFound)
                                {
                                    break;
                                }
                            }
                            else if (VE.RightData.Equals(vgv))
                            {
                                bool EdgeFound = false;
                                foreach (Node VGVertizeCopy in VGVertizesCopy)
                                {
                                    if ((Math.Abs(VGVertizeCopy.Orientation) < 0.1 || Math.Abs(VGVertizeCopy.Orientation) >= 0.1) && Math.Abs(VGVertizeCopy.X - VE.LeftData[0]) <= 1e-10 && Math.Abs(VGVertizeCopy.Y - VE.LeftData[1]) <= 1e-10)
                                    {
                                        VGVertizeCopy.Orientation = 1;
                                        if (!VGErg.Edges.Contains(VE))
                                        {
                                            VGErg.Edges.Add(VE);
                                            EdgeFound = true;
                                        }
                                        //break;
                                    }
                                }
                                if (EdgeFound)
                                {
                                    break;
                                }
                            }
                        }
                    }
                }
            }

            VGVertizes = VGVertizesCopy;

            return(VGErg);
        }