ReCode Project - Exploitation Quantitative...

Had another look through the collection and implemented a variant on Exploitation Quantitative et Qualitative do Programme. I made the probabilites for the different cell shapes vary down the image, to get a vague leftwards pointing v shape.
import Diagrams.Prelude
import Diagrams.Backend.SVG.CmdLine (defaultMain)
import Data.Array (array, assocs, range)
import System.Random (StdGen, newStdGen, randoms)
main = newStdGen >>= defaultMain . diagram
diagram
= bg white . fc black . lwO 0
. flatten . grid . (randoms :: StdGen -> [Double])
flatten a = mconcat
[ c # centerXY # translate (r2 (fromIntegral i, fromIntegral j))
| ((i, j), c) <- assocs a
]
grid rs = array bs [ (ix, cell r ix) | (ix, r) <- range bs `zip` rs ]
where bs = ((0, 0), (sizeW, sizeH))
cell r = choose r . cells
choose r = snd . head . dropWhile ((< r) . fst) . cummulative
cummulative weighted =
let (weights, objects) = unzip weighted
weights' = scanl1 (+) weights
in map (/ last weights') weights' `zip` objects
cells (i, j) =
[ (ascending , tri 0)
, (descending, tri 1)
, (ascending , tri 2)
, (descending, tri 3)
, (ascending , cir id 0)
, (descending, cir id 1)
, (ascending , cir id 2)
, (descending, cir id 3)
, (ascending , cir negate 0)
, (descending, cir negate 1)
, (ascending , cir negate 2)
, (descending, cir negate 3)
]
where
ascending = (fromIntegral j / fromIntegral sizeH) ^ 2
descending = (fromIntegral (sizeH - j) / fromIntegral sizeH) ^ 2
corners k = take 3 . drop k . cycle $
[ p2 (0, 0), p2 (1, 0), p2 (1, 1), p2 (0, 1) ]
tri = strokeLoop . closeLine . fromVertices . corners
cir f k = case corners k of
[a,b,c] -> strokeLoop . closeLine $
arcBetween a c (f (1 - sqrt 0.5)) <> c ~~ b
sizeW, sizeH :: Int
sizeW = 32 - 1
sizeH = 18 - 1
Download this Haskell source.