Exemple #1
0
        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);
        }
Exemple #2
0
        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;
        }
Exemple #3
0
        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();
        }
Exemple #4
0
        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;
            }
        }
Exemple #5
0
        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);
        }