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))); }
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()); }