{-
%------------------------------------------------------------------------------
% Copyright (C) 1997, 1998, 2008 Joern Dinkla, www.dinkla.net
%------------------------------------------------------------------------------
%
% see
%     Joern Dinkla, Geometrische Algorithmen in Haskell, Diploma Thesis,
%     University of Bonn, Germany, 1998. 
%
-}

-- | Onion Layers 
-- \textbf{wird in der Arbeit nicht behandelt}, nur so als Beispiel implementiert.
-- siehe or94. Wichtig ist, das die Funktion zur Berechnung der konvexen
-- H�lle die kollinearen Punkte ausgibt.

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