module GeomAlg.Applications.OnionLayers ( onionLayers )
where
import GeomAlg.Point2 ( P2, lexic2 )
import GeomAlg.Polygon ( Polygon, Polygon2, vertices )
import GeomAlg.ConvexHull.GrahamsScan ( graham4 )
import GeomAlg.External.Sorting ( nubSortBy )
import List ( (\\) )
import GeomAlg.IO.MetaPost
import GeomAlg.Tests.Test
onionLayers :: (Ord a, Num a) => ([P2 a] -> Polygon2 a) -> [P2 a] -> [Polygon2 a]
onionLayers f [] = []
onionLayers f ps = p : onionLayers f (qs \\ vs)
where qs = nubSortBy lexic2 ps
p = f qs
vs = vertices p
draw ps sc
= do putStrLn (pen 0.5)
sequence (map (\ (i,xs) -> putMP [Scaled sc, Filled, Color (i,i,i)] xs) qs)
putStrLn (pen 1)
putMP [Scaled sc] ps
where
os = onionLayers graham4 ps
qs = zip [0.95,0.95 0.5 / fromIntegral (length os)..] os