private static void Traverse(CircularLinkedList <Vector2> subject, CircularLinkedList <Vector2> clip, CircularLinkedList <Vector2> entering, CircularLinkedList <Vector2> exiting, List <CircularLinkedList <Vector2> > polygons, Operation operation) { while (entering.Count > 0) { CircularLinkedList <Vector2> polygon = new CircularLinkedList <Vector2>(); Vector2 start = entering.First.Value; LinkedListNode <Vector2> curNode = subject.Find(start); polygon.AddLast(curNode.Value); curNode = subject.NextOrFirst(curNode); bool IsSubjectNode = true; while (curNode.Value != start) { polygon.AddLast(curNode.Value); if (entering.Contains(curNode.Value)) { entering.Remove(curNode.Value); IsSubjectNode = true; curNode = subject.Find(curNode.Value); } if (exiting.Contains(curNode.Value)) { exiting.Remove(curNode.Value); IsSubjectNode = false; curNode = clip.Find(curNode.Value); } if (IsSubjectNode) { curNode = subject.NextOrFirst(curNode); } else { curNode = clip.NextOrFirst(curNode); } } entering.Remove(curNode.Value); polygons.Add(polygon); } }
private static LinkedListNode <Vector2> TraverseList(CircularLinkedList <Vector2> contour, CircularLinkedList <Vector2> entering, CircularLinkedList <Vector2> exiting, CircularLinkedList <Vector2> polygon, LinkedListNode <Vector2> currentNode, Vector2 startNode, CircularLinkedList <Vector2> contour2) { LinkedListNode <Vector2> contourNode = contour.Find(currentNode.Value); if (contourNode == null) { return(null); } entering.Remove(currentNode.Value); while (contourNode != null && !entering.Contains(contourNode.Value) && !exiting.Contains(contourNode.Value) ) { polygon.AddLast(contourNode.Value); contourNode = contour.NextOrFirst(contourNode); if (contourNode.Value == startNode) { return(null); } } entering.Remove(contourNode.Value); polygon.AddLast(contourNode.Value); return(contour2.NextOrFirst(contour2.Find(contourNode.Value))); }
public static List <Polygon> GetClippedPolygons(Polygon Clip, Polygon Subject) { List <Polygon> output = new List <Polygon>(); CircularLinkedList <Vector2> SubjectL = new CircularLinkedList <Vector2>(); CircularLinkedList <Vector2> ClipL = new CircularLinkedList <Vector2>(); //todo check if subject inside clip bool AllPointsInside = true; for (int i = 0; i < Subject.points.Count; i++) { if (!Clip.IsInside(Subject.points[i])) { AllPointsInside = false; break; } } if (AllPointsInside) { output.Add(Subject); return(output); } for (int i = 0; i < Clip.points.Count; i++) { ClipL.AddLast(new Vector2(Clip.points[i].X, Clip.points[i].Y)); } for (int i = 0; i < Subject.points.Count; i++) { SubjectL.AddLast(new Vector2(Subject.points[i].X, Subject.points[i].Y)); } List <CircularLinkedList <Vector2> > result = (List <CircularLinkedList <Vector2> >)WeilerAtherton.Process(SubjectL, ClipL, Operation.Intersect, Clip, Subject); for (int i = 0; i < result.Count; i++) { output.Add(new Polygon() { Completed = true }); List <Vector2> temp = result[i].ToList <Vector2>(); for (int j = 0; j < temp.Count; j++) { output[output.Count - 1].Add(new Point((int)temp[j].X, (int)temp[j].Y)); } } return(output); }