How to run:
ghc fractal.hs
./fractal
TODO:
- x y to row col
| ----- constants | |
| sizev = 44 | |
| sizeh = 51 | |
| r = sin(pi / 3) | |
| ----- primitive shape constructors | |
| type Shape = Float -> Float -> Bool | |
| rect :: Shape | |
| rect = \ x y -> x > 0 | |
| && y > 0 | |
| && x < sizev | |
| && y < sizeh | |
| triangle :: Shape | |
| triangle = \x y -> rect x y | |
| && r >= x / (2 * y) | |
| && r >= x / (2 * (sizeh - y)) | |
| ----- operations on primitives | |
| scale :: Float -> Shape -> Shape | |
| scale by shape = \x y -> shape (x / by) (y / by) | |
| move :: Float -> Float -> Shape -> Shape | |
| move dx dy shape = \x y -> shape (x - dx) (y - dy) | |
| (|+|) :: Shape -> Shape -> Shape | |
| (|+|) s1 s2 = \x y -> s1 x y || s2 x y | |
| ----- shape transformers | |
| triple :: Shape -> Shape | |
| triple shape = scale 0.5 $ | |
| shape | |
| |+| move 0 sizeh shape | |
| |+| move (sizeh * r) (sizeh / 2) shape | |
| shape = triple $ triple $ triple triangle | |
| ----- rendering | |
| putPixel shape row col = putStr $ if (shape row col) then "█ " else ". " | |
| putRow row = putChar '\n' >> mapM_ (putPixel shape row) [1..sizeh] | |
| main = mapM_ putRow [1..sizev] |