-- Scott Barr 0570107 import LSystem import List -- 1. join :: [Command] -> Command join = foldr (:#) (Sit) -- 2. split :: Command -> [Command] split (p :# r) = p : (split r) split x = [x] -- 3. copy :: Int -> Command -> Command copy n s = join (replicate n s) -- 4. hexagon :: Distance -> Command hexagon d = copy 6 (Go d :# Turn 60) -- 5. polygon :: Distance -> Int -> Command polygon d n | n == 6 = hexagon d | otherwise = copy n (Go d :# Turn (fromIntegral (360 `div` n) ) ) -- 6. spiral :: Distance -> Int -> Distance -> Angle -> Command spiral d t l a = join ([ Go (d - ((fromIntegral s)*l)) :# Turn a | s <- [0,1..t], s <= t] ) -- 7. optimise :: Command -> Command optimise (Go a :# Go b) = optimise(Go (a+b)) optimise (Turn (a) :# Turn (b)) = optimise(Turn ((a)+(b))) optimise (a :# b :# c) | ((c == Sit) || (c == (Turn 0)) || (c == (Go 0))) = (optimise ((optimise a) :# (optimise b))) | otherwise = optimise ((optimise a) :# (optimise ((optimise b) :# (optimise c)))) optimise (a :# b) | ((b == Sit) || (b == (Turn 0)) || (b == (Go 0))) = (optimise a) | ((a == Sit) || (a == (Turn 0)) || (a == (Go 0))) = (optimise b) | otherwise = (optimise a) :# (optimise b) optimise xs = xs -- 8. arrowhead :: Int -> Command arrowhead x = f x where f 0 = Go 10 f (x+1) = g x :# n :# f x :# n :# g x g 0 = Go 10 g (x+1) = f x :# p :# g x :# p :# f x n = Turn (-60) p = Turn (60) -- 9. branch :: Int -> Command branch x = g x where g 0 = GrabPen red :# Go 10 g (x+1) = f x :# n :# Branch (Branch (p :# g x) :# g x) :# p :# f x :# Branch (p :# (f x :# g x) ) :# n :# g x f 0 = GrabPen blue :# Go 10 f (x+1) = f x :# f x n = Turn (22.5) p = Turn (-22.5) -- 10. hilbert :: Int -> Command hilbert x = r x where l 0 = GrabPen blue :# Go 10 l (x+1) = n :# r x :# f x :# p :# l x :# f x :# l x :# p :# f x :# r x :# n r 0 = GrabPen red :# Go 10 r (x+1) = p :# l x :# f x :# n :# r x :# f x :# r x :# n :# f x :# l x :# p f 0 = GrabPen green :# Go 10 f (x+1) = Go 10 n = Turn 90 p = Turn (-90) -- Competition -- run as display 1.0 (comp) comp :: Command comp = GrabPen red :# Go 40 :# Turn 270 :# Go 20 :# Turn 90 :# Go 80 :# Turn 90 :# Go 20 :# Turn 90 :# Go 40 :# Turn 270 :# Go 30 :# Turn 270 :# Go 80 :# Turn 270 :# Go 140 :# Turn 270 :# Go 80 :# Turn 270 :# Go 30 :# Turn 270 :# Go 40 :# Turn 90 :# Go 20 :# Turn 90 :# Go 80 :# Turn 90 :# Go 20 :# Turn 270 :# Go 40 :# Turn 270 :# Go 80 :# GrabPen white :# Turn 90 :# Go 20 :# GrabPen red :# Go 20 :# Turn 180 :# Go 20 :# Turn 90 :# Go 5 :# Turn 180 :# Go 10 :# GrabPen white :# Go 5 :# GrabPen red :# Go 10 :# Turn 180 :# Go 10 :# Turn 90 :# Go 20 :# Turn 180 :# Go 10 :# Turn 270 :# Go 5 :# Turn 180 :# Go 5 :# Turn 90 :# Go 10 :# Turn 90 :# Go 10 :# GrabPen white :# Go 5 :# GrabPen red :# Turn 90 :# Go 20 :# Turn 210 :# Go 22 :# Turn 150 :# Go 20 :# Turn 270 :# GrabPen white :# Go 5 :# Turn 270 :# Go 20 :# Turn 90 :# GrabPen red :# Turn 90 :# Go 20 :# Turn 210 :# Go 22 :# Turn 150 :# Go 20 :# Turn 270 :# GrabPen white :# Go 5 :# GrabPen red :# Go 10 :# Turn 180 :# Go 10 :# Turn 90 :# Go 20 :# Turn 180 :# Go 10 :# Turn 270 :# Go 5 :# Turn 180 :# Go 5 :# Turn 90 :# Go 10 :# Turn 90 :# Go 10 :# GrabPen white :# Go 5 :# GrabPen red :# Turn 90 :# Go 20 :# Turn 210 :# Go 22 :# Turn 150 :# Go 20 :# Turn 270 :# GrabPen white :# Go 5 :# GrabPen red :# Go 10 :# Turn 180 :# Go 5 :# Turn 90 :# Go 20 :# Turn 90 :# GrabPen white :# Go 20 :# GrabPen red :# Turn 210 :# Go 15 :# Turn 120 :# Go 15 :# Turn 210 :# Go 15