{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE TypeFamilies #-}
module Diagrams.TwoD.Path.LSystem
(
Symbol(..)
, Rules
, generations
, lSystemR , lSystem , lSystemPath , lSystemDiagram
, symbol, symbols
, rule
, sierpinski, cantor
, dragon, hexGosper, kochIsland, kochLake
, koch1, koch2, koch3, koch4, koch5, koch6
, tree1, tree2, tree3, tree4, tree5, tree6
, TurtleState
, getTurtlePath, getTurtleDiagram
) where
import Control.Monad.Reader
import Diagrams.Prelude hiding (local)
import Diagrams.TwoD.Path.Turtle.Internal
import Data.Map (Map)
import qualified Data.Map as M
import Data.Maybe (fromMaybe)
data Symbol n
= F
| G
| Plus
| Minus
| Reverse
| Flip
| Push
| Pop
| X Int
| Width n
| Delta n
deriving (Symbol n -> Symbol n -> Bool
forall n. Eq n => Symbol n -> Symbol n -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Symbol n -> Symbol n -> Bool
$c/= :: forall n. Eq n => Symbol n -> Symbol n -> Bool
== :: Symbol n -> Symbol n -> Bool
$c== :: forall n. Eq n => Symbol n -> Symbol n -> Bool
Eq, Symbol n -> Symbol n -> Ordering
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
forall {n}. Ord n => Eq (Symbol n)
forall n. Ord n => Symbol n -> Symbol n -> Bool
forall n. Ord n => Symbol n -> Symbol n -> Ordering
forall n. Ord n => Symbol n -> Symbol n -> Symbol n
min :: Symbol n -> Symbol n -> Symbol n
$cmin :: forall n. Ord n => Symbol n -> Symbol n -> Symbol n
max :: Symbol n -> Symbol n -> Symbol n
$cmax :: forall n. Ord n => Symbol n -> Symbol n -> Symbol n
>= :: Symbol n -> Symbol n -> Bool
$c>= :: forall n. Ord n => Symbol n -> Symbol n -> Bool
> :: Symbol n -> Symbol n -> Bool
$c> :: forall n. Ord n => Symbol n -> Symbol n -> Bool
<= :: Symbol n -> Symbol n -> Bool
$c<= :: forall n. Ord n => Symbol n -> Symbol n -> Bool
< :: Symbol n -> Symbol n -> Bool
$c< :: forall n. Ord n => Symbol n -> Symbol n -> Bool
compare :: Symbol n -> Symbol n -> Ordering
$ccompare :: forall n. Ord n => Symbol n -> Symbol n -> Ordering
Ord, Int -> Symbol n -> ShowS
forall n. Show n => Int -> Symbol n -> ShowS
forall n. Show n => [Symbol n] -> ShowS
forall n. Show n => Symbol n -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Symbol n] -> ShowS
$cshowList :: forall n. Show n => [Symbol n] -> ShowS
show :: Symbol n -> String
$cshow :: forall n. Show n => Symbol n -> String
showsPrec :: Int -> Symbol n -> ShowS
$cshowsPrec :: forall n. Show n => Int -> Symbol n -> ShowS
Show)
type Rules n = Map (Symbol n) [Symbol n]
data Environment n = Environment
{ forall n. Environment n -> Angle n
angleInc :: Angle n
, forall n. Environment n -> [TurtleState n]
turtleStack :: [TurtleState n]
}
push :: TurtleState n -> Environment n -> Environment n
push :: forall n. TurtleState n -> Environment n -> Environment n
push TurtleState n
t (Environment Angle n
a [TurtleState n]
ts) = forall n. Angle n -> [TurtleState n] -> Environment n
Environment Angle n
a (TurtleState n
tforall a. a -> [a] -> [a]
:[TurtleState n]
ts)
pop :: Environment n -> Environment n
pop :: forall n. Environment n -> Environment n
pop (Environment Angle n
a (TurtleState n
_:[TurtleState n]
ts)) = forall n. Angle n -> [TurtleState n] -> Environment n
Environment Angle n
a [TurtleState n]
ts
pop Environment n
_ = forall a. HasCallStack => String -> a
error String
"Tried to pop from an empty stack in LSystem"
incAngle :: Num n => n -> Environment n -> Environment n
incAngle :: forall n. Num n => n -> Environment n -> Environment n
incAngle n
n (Environment Angle n
a [TurtleState n]
ts) = forall n. Angle n -> [TurtleState n] -> Environment n
Environment (forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (forall a. Num a => a -> a -> a
* n
n) Angle n
a) [TurtleState n]
ts
generations :: Ord n => Rules n -> [Symbol n] -> [[Symbol n]]
generations :: forall n. Ord n => Rules n -> [Symbol n] -> [[Symbol n]]
generations Rules n
dict [Symbol n]
syms = forall a. (a -> a) -> a -> [a]
iterate (forall (t :: * -> *) a b. Foldable t => (a -> [b]) -> t a -> [b]
concatMap (forall {k}. Ord k => Map k [k] -> k -> [k]
produce Rules n
dict)) [Symbol n]
syms
where
produce :: Map k [k] -> k -> [k]
produce Map k [k]
d k
s = forall a. a -> Maybe a -> a
fromMaybe [k
s] (forall k a. Ord k => k -> Map k a -> Maybe a
M.lookup k
s Map k [k]
d)
lSystemR :: (Floating n, Ord n) => [Symbol n] -> Reader (Environment n) (TurtleState n)
lSystemR :: forall n.
(Floating n, Ord n) =>
[Symbol n] -> Reader (Environment n) (TurtleState n)
lSystemR [Symbol n]
syms = forall {n} {m :: * -> *}.
(MonadReader (Environment n) m, Floating n, Ord n) =>
TurtleState n -> [Symbol n] -> m (TurtleState n)
go forall n. (Floating n, Ord n) => TurtleState n
startTurtle [Symbol n]
syms
where
go :: TurtleState n -> [Symbol n] -> m (TurtleState n)
go TurtleState n
turtle [] = forall (m :: * -> *) a. Monad m => a -> m a
return TurtleState n
turtle
go TurtleState n
turtle (Symbol n
x:[Symbol n]
xs) = case Symbol n
x of
Symbol n
F -> TurtleState n -> [Symbol n] -> m (TurtleState n)
go (forall n.
(Floating n, Ord n) =>
n -> TurtleState n -> TurtleState n
forward n
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
penDown forall a b. (a -> b) -> a -> b
$ TurtleState n
turtle) [Symbol n]
xs
Symbol n
G -> TurtleState n -> [Symbol n] -> m (TurtleState n)
go (forall n.
(Floating n, Ord n) =>
n -> TurtleState n -> TurtleState n
forward n
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
penUp forall a b. (a -> b) -> a -> b
$ TurtleState n
turtle) [Symbol n]
xs
Symbol n
Plus -> do
Environment n
env <- forall r (m :: * -> *). MonadReader r m => m r
ask
TurtleState n -> [Symbol n] -> m (TurtleState n)
go (forall n. Floating n => n -> TurtleState n -> TurtleState n
left (forall n. Environment n -> Angle n
angleInc Environment n
env forall s a. s -> Getting a s a -> a
^. forall n. Floating n => Iso' (Angle n) n
deg) TurtleState n
turtle) [Symbol n]
xs
Symbol n
Minus -> do
Environment n
env <- forall r (m :: * -> *). MonadReader r m => m r
ask
TurtleState n -> [Symbol n] -> m (TurtleState n)
go (forall n. Floating n => n -> TurtleState n -> TurtleState n
right (forall n. Environment n -> Angle n
angleInc Environment n
env forall s a. s -> Getting a s a -> a
^. forall n. Floating n => Iso' (Angle n) n
deg) TurtleState n
turtle) [Symbol n]
xs
Symbol n
Reverse -> TurtleState n -> [Symbol n] -> m (TurtleState n)
go (forall n. Floating n => n -> TurtleState n -> TurtleState n
left n
180 TurtleState n
turtle) [Symbol n]
xs
Symbol n
Flip -> forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (forall n. Num n => n -> Environment n -> Environment n
incAngle (-n
1)) (TurtleState n -> [Symbol n] -> m (TurtleState n)
go TurtleState n
turtle [Symbol n]
xs)
Symbol n
Push -> forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (forall n. TurtleState n -> Environment n -> Environment n
push (forall n. (Ord n, Floating n) => TurtleState n -> TurtleState n
penUp TurtleState n
turtle)) (TurtleState n -> [Symbol n] -> m (TurtleState n)
go TurtleState n
turtle [Symbol n]
xs)
Symbol n
Pop -> do
Environment n
env <- forall r (m :: * -> *). MonadReader r m => m r
ask
case forall n. Environment n -> [TurtleState n]
turtleStack Environment n
env of
[] -> forall a. HasCallStack => String -> a
error String
"Nothing to pop"
(TurtleState n
t:[TurtleState n]
_) -> forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local forall n. Environment n -> Environment n
pop forall a b. (a -> b) -> a -> b
$ TurtleState n -> [Symbol n] -> m (TurtleState n)
go (TurtleState n
t { currTrail :: Located (Trail' Line V2 n)
currTrail = forall n. TurtleState n -> Located (Trail' Line V2 n)
currTrail TurtleState n
turtle
, paths :: [TurtlePath n]
paths = forall n. TurtleState n -> [TurtlePath n]
paths TurtleState n
turtle}) [Symbol n]
xs
Width n
w -> TurtleState n -> [Symbol n] -> m (TurtleState n)
go (forall n.
(Ord n, Floating n) =>
Measure n -> TurtleState n -> TurtleState n
setPenWidth ((forall a. Num a => a -> a -> a
* (n
1forall a. Num a => a -> a -> a
+n
w)) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (forall n. PenStyle n -> Measure n
penWidth forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall n. TurtleState n -> PenStyle n
currPenStyle forall a b. (a -> b) -> a -> b
$ TurtleState n
turtle))
TurtleState n
turtle) [Symbol n]
xs
Delta n
d -> forall r (m :: * -> *) a. MonadReader r m => (r -> r) -> m a -> m a
local (forall n. Num n => n -> Environment n -> Environment n
incAngle (n
1forall a. Num a => a -> a -> a
+n
d)) (TurtleState n -> [Symbol n] -> m (TurtleState n)
go TurtleState n
turtle [Symbol n]
xs)
Symbol n
_ -> TurtleState n -> [Symbol n] -> m (TurtleState n)
go TurtleState n
turtle [Symbol n]
xs
lSystem :: (Floating n, Ord n)
=> Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem :: forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n Angle n
delta [Symbol n]
axiom Rules n
rules =
forall r a. Reader r a -> r -> a
runReader (forall n.
(Floating n, Ord n) =>
[Symbol n] -> Reader (Environment n) (TurtleState n)
lSystemR (forall n. Ord n => Rules n -> [Symbol n] -> [[Symbol n]]
generations Rules n
rules [Symbol n]
axiom forall a. [a] -> Int -> a
!! Int
n)) (forall n. Angle n -> [TurtleState n] -> Environment n
Environment Angle n
delta [])
lSystemPath :: (Floating n, Ord n)
=> Int -> Angle n -> [Symbol n] -> Rules n -> Path V2 n
lSystemPath :: forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> Path V2 n
lSystemPath Int
n Angle n
delta [Symbol n]
axiom Rules n
rules = forall n. (Floating n, Ord n) => TurtleState n -> Path V2 n
getTurtlePath forall a b. (a -> b) -> a -> b
$ forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n Angle n
delta [Symbol n]
axiom Rules n
rules
lSystemDiagram :: (TypeableFloat n, Renderable (Path V2 n) b)
=> Int -> Angle n -> [Symbol n] -> Rules n -> QDiagram b V2 n Any
lSystemDiagram :: forall n b.
(TypeableFloat n, Renderable (Path V2 n) b) =>
Int -> Angle n -> [Symbol n] -> Rules n -> QDiagram b V2 n Any
lSystemDiagram Int
n Angle n
delta [Symbol n]
axiom Rules n
rules = forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
TurtleState n -> QDiagram b V2 n Any
getTurtleDiagram forall a b. (a -> b) -> a -> b
$ forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n Angle n
delta [Symbol n]
axiom Rules n
rules
symbol :: Fractional n => Char -> Symbol n
symbol :: forall n. Fractional n => Char -> Symbol n
symbol Char
'F' = forall n. Symbol n
F
symbol Char
'G' = forall n. Symbol n
G
symbol Char
'f' = forall n. Symbol n
G
symbol Char
'+' = forall n. Symbol n
Plus
symbol Char
'-' = forall n. Symbol n
Minus
symbol Char
'!' = forall n. Symbol n
Reverse
symbol Char
'~' = forall n. Symbol n
Flip
symbol Char
'[' = forall n. Symbol n
Push
symbol Char
']' = forall n. Symbol n
Pop
symbol Char
'X' = forall n. Int -> Symbol n
X Int
0
symbol Char
'Y' = forall n. Int -> Symbol n
X Int
1
symbol Char
'Z' = forall n. Int -> Symbol n
X Int
2
symbol Char
'A' = forall n. Int -> Symbol n
X Int
3
symbol Char
'B' = forall n. Int -> Symbol n
X Int
4
symbol Char
'C' = forall n. Int -> Symbol n
X Int
5
symbol Char
'<' = forall n. n -> Symbol n
Width n
0.1
symbol Char
'>' = forall n. n -> Symbol n
Width (-n
0.1)
symbol Char
'(' = forall n. n -> Symbol n
Delta n
0.1
symbol Char
')' = forall n. n -> Symbol n
Delta (-n
0.1)
symbol Char
c = forall a. HasCallStack => String -> a
error (String
"Invalid character " forall a. [a] -> [a] -> [a]
++ [Char
c])
symbols :: Fractional n => String -> [Symbol n]
symbols :: forall n. Fractional n => String -> [Symbol n]
symbols = forall a b. (a -> b) -> [a] -> [b]
map forall n. Fractional n => Char -> Symbol n
symbol
rule :: Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule :: forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
c String
cs = (forall n. Fractional n => Char -> Symbol n
symbol Char
c, forall n. Fractional n => String -> [Symbol n]
symbols String
cs)
sierpinski :: RealFloat n => Int -> TurtleState n
sierpinski :: forall n. RealFloat n => Int -> TurtleState n
sierpinski Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
60 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
deg) (forall n. Fractional n => String -> [Symbol n]
symbols String
"FX") Map (Symbol n) [Symbol n]
rules
where
rules :: Map (Symbol n) [Symbol n]
rules = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [ forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"Z"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'X' String
"+FY-FX-FY+"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'Y' String
"-FX+FY+FX-" ]
cantor :: (Renderable (Path V2 n) b, TypeableFloat n) => Int -> QDiagram b V2 n Any
cantor :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Int -> QDiagram b V2 n Any
cantor Int
n = forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
Monoid' a) =>
n -> [a] -> a
vsep n
0.05 forall a b. (a -> b) -> a -> b
$ forall a b. (a -> b) -> [a] -> [b]
map Int -> QDiagram b V2 n Any
dust [Int
0..Int
n]
where
dust :: Int -> QDiagram b V2 n Any
dust Int
i = forall (v :: * -> *) n t.
(InSpace v n t, R2 v, Enveloped t, Transformable t) =>
n -> t -> t
scaleToX n
1 forall b c a. (b -> c) -> (a -> b) -> a -> c
. forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw forall n. OrderedField n => Measure n
ultraThick forall a b. (a -> b) -> a -> b
$ forall n b.
(TypeableFloat n, Renderable (Path V2 n) b) =>
Int -> Angle n -> [Symbol n] -> Rules n -> QDiagram b V2 n Any
lSystemDiagram Int
i (n
0 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) (forall n. Fractional n => String -> [Symbol n]
symbols String
"F") Map (Symbol n) [Symbol n]
rules
rules :: Map (Symbol n) [Symbol n]
rules = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [ forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"FfF"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'f' String
"fff" ]
dragon :: RealFloat n => Int -> TurtleState n
dragon :: forall n. RealFloat n => Int -> TurtleState n
dragon Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
90 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
deg) (forall n. Fractional n => String -> [Symbol n]
symbols String
"FX") Map (Symbol n) [Symbol n]
rules
where
rules :: Map (Symbol n) [Symbol n]
rules = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [ forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"Z"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'X' String
"FX+FY+"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'Y' String
"-FX-FY" ]
hexGosper :: RealFloat n => Int -> TurtleState n
hexGosper :: forall n. RealFloat n => Int -> TurtleState n
hexGosper Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
60 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
deg) (forall n. Fractional n => String -> [Symbol n]
symbols String
"FX") Map (Symbol n) [Symbol n]
hex
where
hex :: Map (Symbol n) [Symbol n]
hex = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [ forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"Z"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'X' String
"FX+FY++FY-FX--FXFX-FY+"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'Y' String
"-FX+FYFY++FY+FX--FX-FY" ]
kochIsland :: RealFloat n => Int -> TurtleState n
kochIsland :: forall n. RealFloat n => Int -> TurtleState n
kochIsland Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
90 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
deg) [Symbol n]
axiom Map (Symbol n) [Symbol n]
koch
where
koch :: Map (Symbol n) [Symbol n]
koch = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"F-F+F+FF-F-F+F"]
axiom :: [Symbol n]
axiom = forall n. Fractional n => String -> [Symbol n]
symbols String
"F-F-F-F"
kochLake :: RealFloat n => Int -> TurtleState n
kochLake :: forall n. RealFloat n => Int -> TurtleState n
kochLake Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
4 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) (forall n. Fractional n => String -> [Symbol n]
symbols String
"F+F+F+F") Map (Symbol n) [Symbol n]
lake
where
lake :: Map (Symbol n) [Symbol n]
lake = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [ forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"F+f-FF+F+FF+Ff+FF-f+FF-F-FF-Ff-FFF"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'f' String
"ffffff"]
koch1 :: RealFloat n => Int -> TurtleState n
koch1 :: forall n. RealFloat n => Int -> TurtleState n
koch1 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
4 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) [Symbol n]
axiom Map (Symbol n) [Symbol n]
koch
where
koch :: Map (Symbol n) [Symbol n]
koch = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"FF-F-F-F-F-F+F"]
axiom :: [Symbol n]
axiom = forall n. Fractional n => String -> [Symbol n]
symbols String
"F-F-F-F"
koch2 :: RealFloat n => Int -> TurtleState n
koch2 :: forall n. RealFloat n => Int -> TurtleState n
koch2 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
4 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) [Symbol n]
axiom Map (Symbol n) [Symbol n]
koch
where
koch :: Map (Symbol n) [Symbol n]
koch = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"FF-F-F-F-FF"]
axiom :: [Symbol n]
axiom = forall n. Fractional n => String -> [Symbol n]
symbols String
"F-F-F-F"
koch3 :: RealFloat n => Int -> TurtleState n
koch3 :: forall n. RealFloat n => Int -> TurtleState n
koch3 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
4 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) [Symbol n]
axiom Map (Symbol n) [Symbol n]
koch
where
koch :: Map (Symbol n) [Symbol n]
koch =forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"FF-F+F-F-FF"]
axiom :: [Symbol n]
axiom = forall n. Fractional n => String -> [Symbol n]
symbols String
"F-F-F-F"
koch4 :: RealFloat n => Int -> TurtleState n
koch4 :: forall n. RealFloat n => Int -> TurtleState n
koch4 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
4 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) [Symbol n]
axiom Map (Symbol n) [Symbol n]
koch
where
koch :: Map (Symbol n) [Symbol n]
koch = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"FF-F--F-F"]
axiom :: [Symbol n]
axiom = forall n. Fractional n => String -> [Symbol n]
symbols String
"F-F-F-F"
koch5 :: RealFloat n => Int -> TurtleState n
koch5 :: forall n. RealFloat n => Int -> TurtleState n
koch5 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
4 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) [Symbol n]
axiom Map (Symbol n) [Symbol n]
koch
where
koch :: Map (Symbol n) [Symbol n]
koch = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"F-FF--F-F"]
axiom :: [Symbol n]
axiom = forall n. Fractional n => String -> [Symbol n]
symbols String
"F-F-F-F"
koch6 :: RealFloat n => Int -> TurtleState n
koch6 :: forall n. RealFloat n => Int -> TurtleState n
koch6 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
4 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) [Symbol n]
axiom Map (Symbol n) [Symbol n]
koch
where
koch :: Map (Symbol n) [Symbol n]
koch = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"F-F+F-F-F"]
axiom :: [Symbol n]
axiom = forall n. Fractional n => String -> [Symbol n]
symbols String
"F-F-F-F"
tree1 :: RealFloat n => Int -> TurtleState n
tree1 :: forall n. RealFloat n => Int -> TurtleState n
tree1 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
14 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) (forall n. Fractional n => String -> [Symbol n]
symbols String
"F") Map (Symbol n) [Symbol n]
tree
where
tree :: Map (Symbol n) [Symbol n]
tree = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"F[+F]F[-F]F"]
tree2 :: RealFloat n => Int -> TurtleState n
tree2 :: forall n. RealFloat n => Int -> TurtleState n
tree2 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
18 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) (forall n. Fractional n => String -> [Symbol n]
symbols String
"F") Map (Symbol n) [Symbol n]
tree
where
tree :: Map (Symbol n) [Symbol n]
tree = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"F[+>>>F]F[->>>F][>>>F]"]
tree3 :: RealFloat n => Int -> TurtleState n
tree3 :: forall n. RealFloat n => Int -> TurtleState n
tree3 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
16 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) (forall n. Fractional n => String -> [Symbol n]
symbols String
"F") Map (Symbol n) [Symbol n]
tree
where
tree :: Map (Symbol n) [Symbol n]
tree = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"FF-[->F+>F+>F]+[+>F->F->F]"]
tree4 :: RealFloat n => Int -> TurtleState n
tree4 :: forall n. RealFloat n => Int -> TurtleState n
tree4 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
18 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) (forall n. Fractional n => String -> [Symbol n]
symbols String
"X") Map (Symbol n) [Symbol n]
tree
where
tree :: Map (Symbol n) [Symbol n]
tree = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [ forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'X' String
"F>>[+X]F>>[-X]+X"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"FF"]
tree5 :: RealFloat n => Int -> TurtleState n
tree5 :: forall n. RealFloat n => Int -> TurtleState n
tree5 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
14 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) (forall n. Fractional n => String -> [Symbol n]
symbols String
"X") Map (Symbol n) [Symbol n]
tree
where
tree :: Map (Symbol n) [Symbol n]
tree = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [ forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'X' String
"F[+>>X][->>X]F>X"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"FF"]
tree6 :: RealFloat n => Int -> TurtleState n
tree6 :: forall n. RealFloat n => Int -> TurtleState n
tree6 Int
n = forall n.
(Floating n, Ord n) =>
Int -> Angle n -> [Symbol n] -> Rules n -> TurtleState n
lSystem Int
n (n
1forall a. Fractional a => a -> a -> a
/n
16 forall b a. b -> AReview a b -> a
@@ forall n. Floating n => Iso' (Angle n) n
turn) (forall n. Fractional n => String -> [Symbol n]
symbols String
"X") Map (Symbol n) [Symbol n]
tree
where
tree :: Map (Symbol n) [Symbol n]
tree = forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [ forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'X' String
"F-[[>>X]+X]+F[+F>>X]-X"
, forall n. Fractional n => Char -> String -> (Symbol n, [Symbol n])
rule Char
'F' String
"FF"]