Get the convex hull of the set of points

var p1 = new Point[Float](0.0, 0.0)
var p2 = new Point[Float](5.0, 0.0)
var p3 = new Point[Float](0.0, 5.0)
var p4 = new Point[Float](5.0, 5.0)
var p5 = new Point[Float](2.5, 2.5)
var arr = new Array[Point[Float]].with_items(p1, p2, p3, p4, p5)
var poly = convex_hull(arr)
assert poly.points == [p4, p3, p1, p2]

Property definitions

geometry :: polygon $ Sys :: convex_hull
# Get the convex hull of the set of `points`
#
# ~~~
# var p1 = new Point[Float](0.0, 0.0)
# var p2 = new Point[Float](5.0, 0.0)
# var p3 = new Point[Float](0.0, 5.0)
# var p4 = new Point[Float](5.0, 5.0)
# var p5 = new Point[Float](2.5, 2.5)
# var arr = new Array[Point[Float]].with_items(p1, p2, p3, p4, p5)
# var poly = convex_hull(arr)
# assert poly.points == [p4, p3, p1, p2]
# ~~~
fun convex_hull(points: Array[Point[Float]]): ConvexPolygon do
	var sorter = new PointXCompare
	sorter.sort(points)
	var l = points.length

	var pl1 = new Array[Point[Float]]
	var pl2 = new Array[Point[Float]]
	for i in [0..l[ do
		while pl2.length >= 2 and not turn_left(pl2[pl2.length - 2], pl2[pl2.length - 1], points[i]) do
			pl2.remove(pl2.last)
		end
		pl2.add(points[i])
	end
	var i = l - 1
	while i >= 0 do
		while pl1.length >= 2 and not turn_left(pl1[pl1.length - 2], pl1[pl1.length - 1], points[i]) do
			pl1.remove(pl1.last)
		end
		pl1.add(points[i])
		i-= 1
	end
	pl1.remove_at(pl1.length - 1)
	pl2.remove_at(pl2.length -1)
	pl2.add_all(pl1)
	return new ConvexPolygon(pl2)
end
lib/geometry/polygon.nit:392,1--429,3