Created
December 10, 2008 22:06
-
-
Save kig/34505 to your computer and use it in GitHub Desktop.
tree.hs
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
-- tree.hs | |
module Main where | |
import Graphics.Rendering.Cairo | |
import Canvas | |
import System.Random | |
main = do | |
gen <- getStdGen | |
let ns = randoms gen :: [Double] | |
canvas (draw ns) 600 600 | |
draw ns w h t = do | |
color white | |
rectangle 0 0 w h | |
fill | |
color black | |
drawTree ns w h t | |
drawTree ns w h t = do | |
translate (w/2) (h+5) | |
mapM_ strokeWidthLine tree | |
where tree = map (mapWidthLine (uscaleP 25)) $ branch ns 8 (pi/2*sin t) | |
branch _ 0 _ = [] | |
branch (r1:r2:rs) n angle = | |
(thickness, points) : subBranches | |
where | |
da = angularDistance 0 angle | |
scale = r2 * 5 * ((1-(abs da / pi)) ** 2) | |
points = map (rotateP (angle + r1 * da) . uscaleP scale) [(0,0), (0, -1)] | |
thickness = n | |
(x,y) = last points | |
subBranches = map (mapWidthLine (translateP x y)) (left ++ right) | |
left = branch (takeOdd rs) (n-1) (angle-r1*pi/4) | |
right = branch (takeEven rs) (n-1) (angle+r2*pi/4) | |
takeOdd [] = [] | |
takeOdd [x] = [] | |
takeOdd (_:x:xs) = x : (takeOdd xs) | |
takeEven [] = [] | |
takeEven [x] = [x] | |
takeEven (x:_:xs) = x : (takeEven xs) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment