void AddNET(Line line, Dictionary <int, NET> dict, int Y) { NET newNET = new NET(); if (line.StartY > line.EndY) { newNET.MaxY = line.StartY; newNET.MinX = line.EndX; newNET.DeltaX = line.ReciprocalK; newNET.MaxX = line.StartX; } else { newNET.MaxY = line.EndY; newNET.MinX = line.StartX; newNET.DeltaX = line.ReciprocalK; newNET.MaxX = line.EndX; } if (dict[Y] == null) { dict[Y] = newNET; } else { var tempNET = dict[Y]; InsertNext(ref tempNET, newNET); dict[Y] = tempNET; } }
void InsertAET(NET net, ref AET aet) { AET lastAET = null; AET nowAET = null; AET tempAET = null; if (net != null) { if (aet == null) { aet = new AET { DeltaX = net.DeltaX, MaxY = net.MaxY, X = net.MinX }; } else { nowAET = aet.Next; lastAET = aet; while (nowAET != null) { if (nowAET.X > net.MinX) { tempAET = new AET() { DeltaX = net.DeltaX, MaxY = net.MaxY, X = net.MinX, }; lastAET.Next = tempAET; tempAET.Next = nowAET; break; } else { lastAET = nowAET; nowAET = nowAET.Next; } } if (tempAET == null) { tempAET = new AET() { DeltaX = net.DeltaX, MaxY = net.MaxY, X = net.MinX, }; lastAET.Next = tempAET; } } } }
//需要排序 void InsertNext(ref NET origin, NET newNET) { NET lastNET = null; NET nowNET = null; bool inserted = false; nowNET = origin; while (nowNET != null) { if (nowNET.MaxX > newNET.MaxX) { //first node if (lastNET == null) { NET temp = nowNET; origin = newNET; newNET.Next = temp; } else { lastNET.Next = newNET; newNET.Next = nowNET; } inserted = true; break; } else { lastNET = nowNET; nowNET = nowNET.Next; } } if (!inserted) { lastNET.Next = newNET; } }
public IEnumerable <Point> GetPoints(IEnumerable <Point> points) { List <Point> pointList = new List <Point>(); int maxY = points.Max(en => en.Y);//后续用非自带方法 int minY = points.Min(en => en.Y); NET net = new NET(); var lines = GetLines(points.ToList()); Dictionary <int, NET> dictNET = new Dictionary <int, NET>(); AET aet = null; for (int Y = minY; Y <= maxY; Y++) { dictNET.Add(Y, null); List <Line> lineList = new List <Line>(); for (int i = 0; i < lines.Count; i++) { if (lines[i].StartY == Y || lines[i].EndY == Y) { AddNET(lines[i], dictNET, Y); lineList.Add(lines[i]); } } foreach (var line in lineList) { lines.Remove(line); } } for (int Y = minY; Y <= maxY; Y++) { if (dictNET[Y] != null) { var newNET = dictNET[Y]; while (newNET != null) { InsertAET(newNET, ref aet); newNET = newNET.Next; } } #region 遍历删除点 DeleteAET(ref aet, Y); #endregion if (aet != null) { #region 遍历得到点 AET left = null; AET right = null; left = aet; right = aet.Next; while (left != null && right != null) { var tempPoints = GetPointsByAET(left, right, Y); pointList.AddRange(tempPoints); left = right.Next; if (left != null) { right = left.Next; } } #endregion UpdateAET(ref aet); } } return(pointList); }