public void QuickHull() { var ltl = CGUtils.LowestThenLeftmost(points); var htr = CGUtils.HighestThenRightmost(points); List <CGPoint> leftPoints = new List <CGPoint>(); List <CGPoint> rightPoints = new List <CGPoint>(); leftPoints.Add(ltl); rightPoints.Add(htr); for (int i = 0; i < points.Count; i++) { if (points[i] != ltl && points[i] != htr) { if (CGUtils.ToLeft(ltl, htr, points[i])) { leftPoints.Add(points[i]); } else { rightPoints.Add(points[i]); } } } leftPoints.Add(htr); rightPoints.Add(ltl); QuickHull(leftPoints, 0, leftPoints.Count - 1); QuickHull(rightPoints, 0, rightPoints.Count - 1); }
public void GrahamScan() { Reset(); if (points.Count < 3) { return; } CGPoint ltl = CGUtils.LowestThenLeftmost(points); int ltlIndex = points.FindIndex(o => o == ltl); if (ltlIndex > 0) { CGPoint temp = points[ltlIndex]; points[ltlIndex] = points[0]; points[0] = temp; } PolarAnglePointCompare compare = new PolarAnglePointCompare() { piovt = ltl }; points.Sort(1, points.Count - 1, compare); Stack <CGPoint> t = new Stack <CGPoint>(); Stack <CGPoint> s = new Stack <CGPoint>(); s.Push(points[0]); s.Push(points[1]); for (int i = points.Count - 1; i > 1; i--) { t.Push(points[i]); } while (t.Count != 0) { var topOfS = s.Pop(); if (CGUtils.ToLeft(s.Peek(), topOfS, t.Peek())) { s.Push(topOfS); s.Push(t.Pop()); } } var last = s.Peek(); CGPoint curr = null; while (s.Count > 0) { curr = s.Pop(); curr.isExtreme = true; if (s.Count == 0) { break; } curr.pred = s.Peek(); s.Peek().succ = curr; } last.succ = curr; curr.pred = last; }
public override void DrawResult() { var ltl = CGUtils.LowestThenLeftmost(WinManager.Instance.data.points); var curr = ltl; do { Draw.DrawLine(curr, curr.succ); curr = curr.succ; } while (ltl != curr); Draw.DrawImage(); }
void InitLeftRightChain() { var htr = CGUtils.HighestThenRightmost(p.vertices); var ltl = CGUtils.LowestThenLeftmost(p.vertices); int index = 0; var leftCurr = htr; while (leftCurr != ltl) { leftChain.Add(index++, leftCurr); leftCurr = leftCurr.succ; } leftChain.Add(index++, ltl); var rightCurr = htr.pred; while (rightCurr != ltl) { rightChain.Add(index++, rightCurr); rightCurr = rightCurr.pred; } }
public void JarvisMarch() { Reset(); CGPoint ltl = CGUtils.LowestThenLeftmost(points); CGPoint curr = ltl; CGPoint next = null; do { curr.isExtreme = true; next = null; for (int i = 0; i < points.Count; i++) { if (points[i] != curr && (next == null || !CGUtils.ToLeft(curr, next, points[i]))) { next = points[i]; } } curr.succ = next; next.pred = curr; curr = next; } while (ltl != curr); }