import Graphics.PS import LSystem.Turtle (Turtle(Turtle)) import LSystem.LSystem import LSystem.Systems import Data.List -- | Render each (p1, p2) as a distinct line. renderLines :: [(Pt, Pt)] -> Path renderLines = foldl f (MoveTo origin) where f pth (p1, p2) = pth +++ MoveTo p1 +++ LineTo p2 -- | Collapse line sequences into a single line. renderLinesO :: [(Pt, Pt)] -> Path renderLinesO = foldl f (MoveTo origin) . snd . mapAccumL g origin where g p (a,b) | p == a = (b, Right b) | otherwise = (b, Left (a,b)) f pth (Left (p1, p2)) = pth +++ MoveTo p1 +++ LineTo p2 f pth (Right p2) = pth +++ LineTo p2 toPt ((x1, y1), (x2, y2)) = (Pt x1 y1, Pt x2 y2) renderL :: (LSystem, Double, Double) -> Int -> Double -> [(Pt,Pt)] renderL (l, ta, ls) i ll = map toPt r where r = render [] (\ll p1 p2 -> (p1, p2) : ll) (expand l i) a a = Turtle (radians ta) 1 (0, 0) (pi / 2) ll ls [] draw :: Double -> Path -> Image draw z p = (translate 200 200 . scale z z) (Stroke g p) where g = greyGS 0.5 l0i, l1i, l2i, l3i, l4i, l5i, l6i, l7i, l8i, l9i, lAi, lBi, lCi :: Image renderLL a b = renderLines . renderL a b renderLO a b = renderLinesO . renderL a b l0i = draw 0.4 $ renderLO l0d 3 5 l1i = draw 1.25 $ renderLO l1d 3 5 l2i = draw 1.0 $ renderLO l2d 5 5 l3i = draw 0.4 $ renderLO l3d 12 5 l4i = draw 1.0 $ renderLO l4d 6 5 l5i = draw 1.2 $ renderLO l5d 4 5 l6i = draw 0.5 $ renderLO l6d 7 5 l7i = draw 1.0 $ renderLO l7d 4 5 l8i = draw 0.1 $ renderLO l8d 6 5 l9i = draw 1.2 $ renderLO l9d 10 40 lAi = draw 0.8 $ renderLO lAd 11 5 lBi = draw 1.0 $ renderLO lBd 6 5 lCi = draw 2.0 $ renderLO lCd 5 5 lDi = draw 0.4 $ renderLO lDd 5 1 main :: IO () main = cg "test.ps" (Paper 900 600) [ l0i, l1i, l2i, l3i, l4i, l5i , l6i, l7i, l8i, l9i, lAi, lBi , lCi, lDi ]