示例#1
0
        private Point[] DoRecurse(Point[] ps)
        {
            if (ps.Length < FLOOR)
            {
                return(HullTools.GetConvexHull(ps).ToArray());
            }
            var hull    = new Hull(ps);
            var twoSets = HullTools.Split(hull);
            var first   = DoRecurse(twoSets.Item1.Points);
            var second  = DoRecurse(twoSets.Item2.Points);

            return(CreatUnion(new Hull(first), new Hull(second)));
        }
示例#2
0
        private Point[] CreatUnion(Hull first, Hull second)
        {
            var aPoint = HullTools.GetInnerPoint(first);

            Point[] merged;
            if (HullTools.IsWithinPolygon(aPoint, second))
            {
                merged = HullTools.MergePointsByPolarAngle(first.Points, second.Points);
            }
            else
            {
                var twoLines = HullTools.GetSupportPoints(aPoint, second);
                var tempHull = new Hull(new[] { twoLines.Item1, twoLines.Item2, aPoint });
                merged = HullTools.MergePointsByPolarAngle(
                    first.Points.Where(x => !HullTools.IsWithinPolygon(x, tempHull)).ToArray(),
                    second.Points.Where(x => !HullTools.IsWithinPolygon(x, tempHull)).ToArray()
                    );
            }
            return(HullTools.GetConvexHull(merged).ToArray());
        }