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); }
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); }