core :: Sys :: convex_hull
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]
# 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