{-# LANGUAGE ExplicitForAll #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeOperators #-}
module Diagrams.TwoD.Path.IteratedSubset
(
refineSegment, iterTrail
, GeneratorSegment(..), mkGS, mkGS3, Generator
, refineGeneratorSegment, iterGenerator
, averageLine
, bevelLine
, showGenerator
, koch
, levy
, zag
, sqUp
, sqUpDown
, dragonGen
, polyaGen
, terDragonGen
, invTerDragonGen
, ventrella56b
, yinDragonGen
, ventrella67
, innerFlipQuartetGen
, antiGosperGen
, mandelbrotSnowflakeGen
, snowflake
, IterTrailConfig(..), randITC, drawITC, drawITCScaled
, randIterGrid
) where
import Diagrams.Core.Points ()
import Diagrams.Prelude
import Control.Monad (replicateM)
import Control.Monad.Random (evalRandIO, getRandom, getRandomR)
import Control.Monad.Random.Class (MonadRandom)
import Data.Bits (xor)
import Data.Maybe (mapMaybe)
import Data.Typeable
import System.Random (Random)
import qualified Diagrams.TwoD.Layout.Grid as LG
iterTrail :: RealFloat n => Trail' Line V2 n -> [Trail' Line V2 n]
iterTrail :: forall n. RealFloat n => Trail' Line V2 n -> [Trail' Line V2 n]
iterTrail Trail' Line V2 n
seed' = (Trail' Line V2 n -> Trail' Line V2 n)
-> Trail' Line V2 n -> [Trail' Line V2 n]
forall a. (a -> a) -> a -> [a]
iterate (\Trail' Line V2 n
tr -> [Trail' Line V2 n] -> Trail' Line V2 n
forall a. Monoid a => [a] -> a
mconcat ([Trail' Line V2 n] -> Trail' Line V2 n)
-> ([V2 n] -> [Trail' Line V2 n]) -> [V2 n] -> Trail' Line V2 n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (V2 n -> Maybe (Trail' Line V2 n)) -> [V2 n] -> [Trail' Line V2 n]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (Trail' Line V2 n -> V2 n -> Maybe (Trail' Line V2 n)
forall n.
RealFloat n =>
Trail' Line V2 n -> V2 n -> Maybe (Trail' Line V2 n)
refineSegment Trail' Line V2 n
tr) ([V2 n] -> Trail' Line V2 n) -> [V2 n] -> Trail' Line V2 n
forall a b. (a -> b) -> a -> b
$ [V2 n]
offs)
([Vn (Trail' Line V2 n)] -> Trail' Line V2 n
forall t. TrailLike t => [Vn t] -> t
fromOffsets [Vn (Trail' Line V2 n)
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX])
where offs :: [V2 n]
offs = (Segment Closed V2 n -> V2 n) -> [Segment Closed V2 n] -> [V2 n]
forall a b. (a -> b) -> [a] -> [b]
map Segment Closed V2 n -> V2 n
forall (v :: * -> *) n. Segment Closed v n -> v n
segOffset ([Segment Closed V2 n] -> [V2 n])
-> (Trail' Line V2 n -> [Segment Closed V2 n])
-> Trail' Line V2 n
-> [V2 n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Trail' Line V2 n -> [Segment Closed V2 n]
forall (v :: * -> *) n. Trail' Line v n -> [Segment Closed v n]
lineSegments (Trail' Line V2 n -> [V2 n]) -> Trail' Line V2 n -> [V2 n]
forall a b. (a -> b) -> a -> b
$ Trail' Line V2 n
seed'
refineSegment :: RealFloat n =>
Trail' Line V2 n -> V2 n ->
Maybe (Trail' Line V2 n)
refineSegment :: forall n.
RealFloat n =>
Trail' Line V2 n -> V2 n -> Maybe (Trail' Line V2 n)
refineSegment Trail' Line V2 n
t V2 n
sOff
| V2 n
tOff V2 n -> V2 n -> Bool
forall a. Eq a => a -> a -> Bool
== V2 n
forall a. Num a => V2 a
forall (f :: * -> *) a. (Additive f, Num a) => f a
zero Bool -> Bool -> Bool
|| V2 n
sOff V2 n -> V2 n -> Bool
forall a. Eq a => a -> a -> Bool
== V2 n
forall a. Num a => V2 a
forall (f :: * -> *) a. (Additive f, Num a) => f a
zero = Maybe (Trail' Line V2 n)
forall a. Maybe a
Nothing
| Bool
otherwise = Trail' Line V2 n -> Maybe (Trail' Line V2 n)
forall a. a -> Maybe a
Just (Trail' Line V2 n -> Maybe (Trail' Line V2 n))
-> Trail' Line V2 n -> Maybe (Trail' Line V2 n)
forall a b. (a -> b) -> a -> b
$ Trail' Line V2 n
t Trail' Line V2 n
-> (Trail' Line V2 n -> Trail' Line V2 n) -> Trail' Line V2 n
forall a b. a -> (a -> b) -> b
# n -> Trail' Line V2 n -> Trail' Line V2 n
forall (v :: * -> *) n a.
(InSpace v n a, Eq n, Fractional n, Transformable a) =>
n -> a -> a
scale n
k Trail' Line V2 n
-> (Trail' Line V2 n -> Trail' Line V2 n) -> Trail' Line V2 n
forall a b. a -> (a -> b) -> b
# Angle n -> Trail' Line V2 n -> Trail' Line V2 n
forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
Angle n -> t -> t
rotate Angle n
r
where
tOff :: V2 n
tOff = Trail' Line V2 n -> V2 n
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
Trail' Line v n -> v n
lineOffset Trail' Line V2 n
t
k :: n
k = V2 n -> n
forall a. Floating a => V2 a -> a
forall (f :: * -> *) a. (Metric f, Floating a) => f a -> a
norm V2 n
sOff n -> n -> n
forall a. Fractional a => a -> a -> a
/ V2 n -> n
forall a. Floating a => V2 a -> a
forall (f :: * -> *) a. (Metric f, Floating a) => f a -> a
norm V2 n
tOff
r :: Angle n
r = (V2 n
sOffV2 n -> Getting (Angle n) (V2 n) (Angle n) -> Angle n
forall s a. s -> Getting a s a -> a
^.Getting (Angle n) (V2 n) (Angle n)
forall n. RealFloat n => Lens' (V2 n) (Angle n)
Lens' (V2 n) (Angle n)
forall (t :: * -> *) n.
(HasTheta t, RealFloat n) =>
Lens' (t n) (Angle n)
_theta) Angle n -> Angle n -> Angle n
forall a. Num a => Angle a -> Angle a -> Angle a
forall (f :: * -> *) a. (Additive f, Num a) => f a -> f a -> f a
^-^ (V2 n
tOffV2 n -> Getting (Angle n) (V2 n) (Angle n) -> Angle n
forall s a. s -> Getting a s a -> a
^.Getting (Angle n) (V2 n) (Angle n)
forall n. RealFloat n => Lens' (V2 n) (Angle n)
Lens' (V2 n) (Angle n)
forall (t :: * -> *) n.
(HasTheta t, RealFloat n) =>
Lens' (t n) (Angle n)
_theta)
data GeneratorSegment n = GS (V2 n) Bool Bool
type Generator n = [GeneratorSegment n]
generatorSegmentOffset :: GeneratorSegment n -> V2 n
generatorSegmentOffset :: forall n. GeneratorSegment n -> V2 n
generatorSegmentOffset (GS V2 n
v Bool
_ Bool
_) = V2 n
v
generatorToLine :: (Floating n, Ord n) => Generator n -> Trail' Line V2 n
generatorToLine :: forall n. (Floating n, Ord n) => Generator n -> Trail' Line V2 n
generatorToLine = [Vn (Trail' Line V2 n)] -> Trail' Line V2 n
[V2 n] -> Trail' Line V2 n
forall t. TrailLike t => [Vn t] -> t
fromOffsets ([V2 n] -> Trail' Line V2 n)
-> (Generator n -> [V2 n]) -> Generator n -> Trail' Line V2 n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GeneratorSegment n -> V2 n) -> Generator n -> [V2 n]
forall a b. (a -> b) -> [a] -> [b]
map GeneratorSegment n -> V2 n
forall n. GeneratorSegment n -> V2 n
generatorSegmentOffset
showGenerator
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> Generator n -> QDiagram b V2 n Any
showGenerator :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Generator n -> QDiagram b V2 n Any
showGenerator Generator n
g = [QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall a. Monoid a => [a] -> a
mconcat ([QDiagram b V2 n Any] -> QDiagram b V2 n Any)
-> [QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall a b. (a -> b) -> a -> b
$ (Located (Trail V2 n) -> GeneratorSegment n -> QDiagram b V2 n Any)
-> [Located (Trail V2 n)] -> Generator n -> [QDiagram b V2 n Any]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Located (Trail V2 n) -> GeneratorSegment n -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Located (Trail V2 n) -> GeneratorSegment n -> QDiagram b V2 n Any
showGenSeg (Located (Trail V2 n) -> [Located (Trail V2 n)]
forall t (v :: * -> *) n.
(V t ~ v, N t ~ n, TrailLike t) =>
Located (Trail v n) -> [t]
explodeTrail (Trail' Line V2 n -> Trail V2 n
forall l (v :: * -> *) n. Trail' l v n -> Trail v n
Trail (Generator n -> Trail' Line V2 n
forall n. (Floating n, Ord n) => Generator n -> Trail' Line V2 n
generatorToLine Generator n
g) Trail V2 n
-> Point (V (Trail V2 n)) (N (Trail V2 n)) -> Located (Trail V2 n)
forall a. a -> Point (V a) (N a) -> Located a
`at` Point (V (Trail V2 n)) (N (Trail V2 n))
Point V2 n
forall (f :: * -> *) a. (Additive f, Num a) => Point f a
origin)) Generator n
g
where
showGenSeg
:: (Renderable (Path V2 n) b, TypeableFloat n)
=> Located (Trail V2 n) -> GeneratorSegment n -> QDiagram b V2 n Any
showGenSeg :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Located (Trail V2 n) -> GeneratorSegment n -> QDiagram b V2 n Any
showGenSeg Located (Trail V2 n)
locTr (GS V2 n
_ Bool
flip1 Bool
_) =
let locTr' :: Located (Trail V2 n)
locTr' = if Bool
flip1 then Located (Trail V2 n) -> Located (Trail V2 n)
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
Located (Trail v n) -> Located (Trail v n)
reverseLocTrail Located (Trail V2 n)
locTr else Located (Trail V2 n)
locTr
in ArrowOpts n -> Point V2 n -> V2 n -> QDiagram b V2 n Any
forall n b.
(TypeableFloat n, Renderable (Path V2 n) b) =>
ArrowOpts n -> Point V2 n -> V2 n -> QDiagram b V2 n Any
arrowAt' (ArrowOpts n
forall d. Default d => d
with ArrowOpts n -> (ArrowOpts n -> ArrowOpts n) -> ArrowOpts n
forall a b. a -> (a -> b) -> b
& (ArrowHT n -> Identity (ArrowHT n))
-> ArrowOpts n -> Identity (ArrowOpts n)
forall n (f :: * -> *).
Functor f =>
(ArrowHT n -> f (ArrowHT n)) -> ArrowOpts n -> f (ArrowOpts n)
arrowHead ((ArrowHT n -> Identity (ArrowHT n))
-> ArrowOpts n -> Identity (ArrowOpts n))
-> ArrowHT n -> ArrowOpts n -> ArrowOpts n
forall s t a b. ASetter s t a b -> b -> s -> t
.~ ArrowHT n
forall n. RealFloat n => ArrowHT n
halfDart) (Located (Trail V2 n) -> Point (V (Trail V2 n)) (N (Trail V2 n))
forall a. Located a -> Point (V a) (N a)
loc Located (Trail V2 n)
locTr') (Trail V2 n -> V2 n
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
Trail v n -> v n
trailOffset (Located (Trail V2 n) -> Trail V2 n
forall a. Located a -> a
unLoc Located (Trail V2 n)
locTr'))
mkGS :: (n, n, Int, Int) -> GeneratorSegment n
mkGS :: forall n. (n, n, Int, Int) -> GeneratorSegment n
mkGS (n
x, n
y, Int
flip1, Int
flip2)
= V2 n -> Int -> Int -> GeneratorSegment n
forall n. V2 n -> Int -> Int -> GeneratorSegment n
mkGSv ((n, n) -> V2 n
forall n. (n, n) -> V2 n
r2 (n
x,n
y)) Int
flip1 Int
flip2
mkGS3 :: Floating n => (n, n, Int, Int) -> GeneratorSegment n
mkGS3 :: forall n. Floating n => (n, n, Int, Int) -> GeneratorSegment n
mkGS3 (n
x, n
y, Int
flip1, Int
flip2)
= V2 n -> Int -> Int -> GeneratorSegment n
forall n. V2 n -> Int -> Int -> GeneratorSegment n
mkGSv ((n, n) -> V2 n
forall n. (n, n) -> V2 n
r2 (n
x,n
y) V2 n -> (V2 n -> V2 n) -> V2 n
forall a b. a -> (a -> b) -> b
# n -> V2 n -> V2 n
forall n t. (InSpace V2 n t, Transformable t) => n -> t -> t
shearX n
0.5 V2 n -> (V2 n -> V2 n) -> V2 n
forall a b. a -> (a -> b) -> b
# n -> V2 n -> V2 n
forall (v :: * -> *) n t.
(InSpace v n t, R2 v, Fractional n, Transformable t) =>
n -> t -> t
scaleY (n -> n
forall a. Floating a => a -> a
sqrt n
3 n -> n -> n
forall a. Fractional a => a -> a -> a
/ n
2)) Int
flip1 Int
flip2
mkGSv :: V2 n -> Int -> Int -> GeneratorSegment n
mkGSv :: forall n. V2 n -> Int -> Int -> GeneratorSegment n
mkGSv V2 n
v Int
flip1 Int
flip2 = V2 n -> Bool -> Bool -> GeneratorSegment n
forall n. V2 n -> Bool -> Bool -> GeneratorSegment n
GS V2 n
v (Int
flip1 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0) (Int
flip2 Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< Int
0)
refineGeneratorSegment :: RealFloat n =>
Trail' Line V2 n -> GeneratorSegment n ->
Maybe (Trail' Line V2 n)
refineGeneratorSegment :: forall n.
RealFloat n =>
Trail' Line V2 n -> GeneratorSegment n -> Maybe (Trail' Line V2 n)
refineGeneratorSegment Trail' Line V2 n
t (GS V2 n
sOff Bool
flipX Bool
flipY)
= Trail' Line V2 n -> V2 n -> Maybe (Trail' Line V2 n)
forall n.
RealFloat n =>
Trail' Line V2 n -> V2 n -> Maybe (Trail' Line V2 n)
refineSegment (Trail' Line V2 n
t Trail' Line V2 n
-> (Trail' Line V2 n -> Trail' Line V2 n) -> Trail' Line V2 n
forall a b. a -> (a -> b) -> b
# Bool -> Bool -> Trail' Line V2 n -> Trail' Line V2 n
forall n.
(Ord n, Floating n) =>
Bool -> Bool -> Trail' Line V2 n -> Trail' Line V2 n
doFlips Bool
flipX Bool
flipY) V2 n
sOff
doFlips :: (Ord n, Floating n) => Bool -> Bool -> Trail' Line V2 n -> Trail' Line V2 n
doFlips :: forall n.
(Ord n, Floating n) =>
Bool -> Bool -> Trail' Line V2 n -> Trail' Line V2 n
doFlips Bool
flipX Bool
flipY
= (if Bool
flipX Bool -> Bool -> Bool
forall a. Bits a => a -> a -> a
`xor` Bool
flipY then Trail' Line V2 n -> Trail' Line V2 n
forall (v :: * -> *) n t.
(InSpace v n t, R2 v, Transformable t) =>
t -> t
reflectY else Trail' Line V2 n -> Trail' Line V2 n
forall a. a -> a
id)
(Trail' Line V2 n -> Trail' Line V2 n)
-> (Trail' Line V2 n -> Trail' Line V2 n)
-> Trail' Line V2 n
-> Trail' Line V2 n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (if Bool
flipX then Trail' Line V2 n -> Trail' Line V2 n
forall (v :: * -> *) n.
(Metric v, OrderedField n) =>
Trail' Line v n -> Trail' Line v n
reverseLine else Trail' Line V2 n -> Trail' Line V2 n
forall a. a -> a
id)
iterGenerator :: RealFloat n => Generator n -> [Trail' Line V2 n]
iterGenerator :: forall n. RealFloat n => Generator n -> [Trail' Line V2 n]
iterGenerator Generator n
g = (Trail' Line V2 n -> Trail' Line V2 n)
-> Trail' Line V2 n -> [Trail' Line V2 n]
forall a. (a -> a) -> a -> [a]
iterate (\Trail' Line V2 n
tr -> [Trail' Line V2 n] -> Trail' Line V2 n
forall a. Monoid a => [a] -> a
mconcat ([Trail' Line V2 n] -> Trail' Line V2 n)
-> (Generator n -> [Trail' Line V2 n])
-> Generator n
-> Trail' Line V2 n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (GeneratorSegment n -> Maybe (Trail' Line V2 n))
-> Generator n -> [Trail' Line V2 n]
forall a b. (a -> Maybe b) -> [a] -> [b]
mapMaybe (Trail' Line V2 n -> GeneratorSegment n -> Maybe (Trail' Line V2 n)
forall n.
RealFloat n =>
Trail' Line V2 n -> GeneratorSegment n -> Maybe (Trail' Line V2 n)
refineGeneratorSegment Trail' Line V2 n
tr) (Generator n -> Trail' Line V2 n)
-> Generator n -> Trail' Line V2 n
forall a b. (a -> b) -> a -> b
$ Generator n
g)
([Vn (Trail' Line V2 n)] -> Trail' Line V2 n
forall t. TrailLike t => [Vn t] -> t
fromOffsets [Vn (Trail' Line V2 n)
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX])
koch :: (TrailLike t, V t ~ V2, N t ~ n) => t
koch :: forall t n. (TrailLike t, V t ~ V2, N t ~ n) => t
koch = [Vn t] -> t
forall t. TrailLike t => [Vn t] -> t
fromOffsets [Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX, V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX V2 n -> (V2 n -> V2 n) -> V2 n
forall a b. a -> (a -> b) -> b
# n -> V2 n -> V2 n
forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
n -> t -> t
rotateBy (n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
6), V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX V2 n -> (V2 n -> V2 n) -> V2 n
forall a b. a -> (a -> b) -> b
# n -> V2 n -> V2 n
forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
n -> t -> t
rotateBy (-n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
6), Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX]
levy :: (TrailLike t, V t ~ V2, N t ~ n) => t
levy :: forall t n. (TrailLike t, V t ~ V2, N t ~ n) => t
levy = [Vn t] -> t
forall t. TrailLike t => [Vn t] -> t
fromOffsets [Vn t
V2 n
forall (v :: * -> *) n. (R2 v, Additive v, Num n) => v n
unitY, Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX]
zag :: (TrailLike t, V t ~ V2, N t ~ n) => t
zag :: forall t n. (TrailLike t, V t ~ V2, N t ~ n) => t
zag = [Vn t] -> t
forall t. TrailLike t => [Vn t] -> t
fromOffsets [Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX, (-n
0.5) PrevDim (V2 n) -> FinalCoord (V2 n) -> V2 n
forall c. Coordinates c => PrevDim c -> FinalCoord c -> c
^& n
FinalCoord (V2 n)
1, Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX]
sqUp :: (TrailLike t, V t ~ V2, N t ~ n) => t
sqUp :: forall t n. (TrailLike t, V t ~ V2, N t ~ n) => t
sqUp = [Vn t] -> t
forall t. TrailLike t => [Vn t] -> t
fromOffsets [Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX, Vn t
V2 n
forall (v :: * -> *) n. (R2 v, Additive v, Num n) => v n
unitY, Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX, Vn t
V2 n
forall (v :: * -> *) n. (R2 v, Additive v, Num n) => v n
unit_Y, Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX]
sqUpDown :: (TrailLike t, V t ~ V2, N t ~ n) => t
sqUpDown :: forall t n. (TrailLike t, V t ~ V2, N t ~ n) => t
sqUpDown = [Vn t] -> t
forall t. TrailLike t => [Vn t] -> t
fromOffsets [Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX, Vn t
V2 n
forall (v :: * -> *) n. (R2 v, Additive v, Num n) => v n
unitY, Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX, n
2 n -> V2 n -> V2 n
forall (f :: * -> *) a. (Functor f, Num a) => a -> f a -> f a
*^ V2 n
forall (v :: * -> *) n. (R2 v, Additive v, Num n) => v n
unit_Y, Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX, Vn t
V2 n
forall (v :: * -> *) n. (R2 v, Additive v, Num n) => v n
unitY, Vn t
V2 n
forall (v :: * -> *) n. (R1 v, Additive v, Num n) => v n
unitX]
dragonGen :: Generator Double
dragonGen :: Generator Double
dragonGen
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. (n, n, Int, Int) -> GeneratorSegment n
mkGS
[ (Double
1, Double
0, Int
1, Int
1)
, (Double
0, Double
1, -Int
1, -Int
1)
]
polyaGen :: Generator Double
polyaGen :: Generator Double
polyaGen
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. (n, n, Int, Int) -> GeneratorSegment n
mkGS
[ (Double
1, Double
0, Int
1, -Int
1)
, (Double
0, Double
1, -Int
1, Int
1)
]
terDragonGen :: Generator Double
terDragonGen :: Generator Double
terDragonGen
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. Floating n => (n, n, Int, Int) -> GeneratorSegment n
mkGS3
[ (Double
0, Double
1, Int
1, Int
1)
, (Double
1, -Double
1, Int
1, Int
1)
, (Double
0, Double
1, Int
1, Int
1)
]
invTerDragonGen :: Generator Double
invTerDragonGen :: Generator Double
invTerDragonGen
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. Floating n => (n, n, Int, Int) -> GeneratorSegment n
mkGS3
[ (Double
0, Double
1, -Int
1, Int
1)
, (Double
1, -Double
1, -Int
1, Int
1)
, (Double
0, Double
1, -Int
1, Int
1)
]
ventrella56b :: Generator Double
ventrella56b :: Generator Double
ventrella56b
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. Floating n => (n, n, Int, Int) -> GeneratorSegment n
mkGS3
[ (Double
0, Double
1, -Int
1, Int
1)
, (Double
1, -Double
1, Int
1, Int
1)
, (Double
0, Double
1, -Int
1, Int
1)
]
yinDragonGen :: Generator Double
yinDragonGen :: Generator Double
yinDragonGen
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. Floating n => (n, n, Int, Int) -> GeneratorSegment n
mkGS3
[ (Double
0, Double
1, Int
1, Int
1)
, (Double
0, Double
1, -Int
1, -Int
1)
, (Double
1, -Double
1, Int
1, Int
1)
]
ventrella67 :: Generator Double
ventrella67 :: Generator Double
ventrella67
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. (n, n, Int, Int) -> GeneratorSegment n
mkGS
[ (Double
1, Double
1, -Int
1, -Int
1)
, (Double
1, Double
0, Int
1, Int
1)
, (Double
0, -Double
1, Int
1, Int
1)
]
innerFlipQuartetGen :: Generator Double
innerFlipQuartetGen :: Generator Double
innerFlipQuartetGen
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. (n, n, Int, Int) -> GeneratorSegment n
mkGS
[ (Double
0, Double
1, Int
1, -Int
1)
, (Double
0, Double
1, -Int
1, Int
1)
, (Double
1, Double
0, -Int
1, Int
1)
, (Double
0, -Double
1, Int
1, -Int
1)
, (Double
1, Double
0, -Int
1, Int
1)
]
antiGosperGen :: Generator Double
antiGosperGen :: Generator Double
antiGosperGen
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. Floating n => (n, n, Int, Int) -> GeneratorSegment n
mkGS3
[ ( Double
1, Double
0, Int
1, Int
1)
, ( Double
0, Double
1, Int
1, Int
1)
, (-Double
1, Double
0, -Int
1, -Int
1)
, (-Double
1, Double
1, -Int
1, -Int
1)
, ( Double
1, Double
0, Int
1, Int
1)
, ( Double
1, Double
0, -Int
1, -Int
1)
, ( Double
1, -Double
1, -Int
1, -Int
1)
]
mandelbrotSnowflakeGen :: Generator Double
mandelbrotSnowflakeGen :: Generator Double
mandelbrotSnowflakeGen
= ((Double, Double, Int, Int) -> GeneratorSegment Double)
-> [(Double, Double, Int, Int)] -> Generator Double
forall a b. (a -> b) -> [a] -> [b]
map (Double, Double, Int, Int) -> GeneratorSegment Double
forall n. Floating n => (n, n, Int, Int) -> GeneratorSegment n
mkGS3
[ (-Double
1, Double
2, Int
1, -Int
1)
, (-Double
1, Double
2, Int
1, Int
1)
, ( Double
1, Double
1, Int
1, Int
1)
, ( Double
2, -Double
1, Int
1, Int
1)
, (-Double
1, Double
0, Int
1, Int
1)
, (-Double
1, Double
0, Int
1, -Int
1)
, ( Double
0, -Double
1, Int
1, -Int
1)
, ( Double
1, -Double
1, Int
1, -Int
1)
, ( Double
1, Double
1, Int
1, Int
1)
, ( Double
0, -Double
1, Int
1, Int
1)
, ( Double
0, -Double
1, Int
1, -Int
1)
, ( Double
1, Double
1, Int
1, -Int
1)
, ( Double
1, Double
1, Int
1, Int
1)
]
averageLine :: (Metric v, Floating n, Ord n) => Trail' Line v n -> Trail' Line v n
averageLine :: forall (v :: * -> *) n.
(Metric v, Floating n, Ord n) =>
Trail' Line v n -> Trail' Line v n
averageLine = [v n] -> Trail' Line v n
[Vn (Trail' Line v n)] -> Trail' Line v n
forall t. TrailLike t => [Vn t] -> t
fromOffsets ([v n] -> Trail' Line v n)
-> (Trail' Line v n -> [v n]) -> Trail' Line v n -> Trail' Line v n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((v n -> v n -> v n) -> [v n] -> [v n] -> [v n]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (n -> v n -> v n -> v n
forall a. Num a => a -> v a -> v a -> v a
forall (f :: * -> *) a.
(Additive f, Num a) =>
a -> f a -> f a -> f a
lerp n
0.5) ([v n] -> [v n] -> [v n]) -> ([v n] -> [v n]) -> [v n] -> [v n]
forall a b. ([v n] -> a -> b) -> ([v n] -> a) -> [v n] -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [v n] -> [v n]
forall a. HasCallStack => [a] -> [a]
tail) ([v n] -> [v n])
-> (Trail' Line v n -> [v n]) -> Trail' Line v n -> [v n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Segment Closed v n -> v n) -> [Segment Closed v n] -> [v n]
forall a b. (a -> b) -> [a] -> [b]
map Segment Closed v n -> v n
forall (v :: * -> *) n. Segment Closed v n -> v n
segOffset ([Segment Closed v n] -> [v n])
-> (Trail' Line v n -> [Segment Closed v n])
-> Trail' Line v n
-> [v n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Trail' Line v n -> [Segment Closed v n]
forall (v :: * -> *) n. Trail' Line v n -> [Segment Closed v n]
lineSegments
bevelLine :: (Metric v, Floating n, Ord n) => Trail' Line v n -> Trail' Line v n
bevelLine :: forall (v :: * -> *) n.
(Metric v, Floating n, Ord n) =>
Trail' Line v n -> Trail' Line v n
bevelLine = [v n] -> Trail' Line v n
[Vn (Trail' Line v n)] -> Trail' Line v n
forall t. TrailLike t => [Vn t] -> t
fromOffsets ([v n] -> Trail' Line v n)
-> (Trail' Line v n -> [v n]) -> Trail' Line v n -> Trail' Line v n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[v n]] -> [v n]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat ([[v n]] -> [v n])
-> (Trail' Line v n -> [[v n]]) -> Trail' Line v n -> [v n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ((v n -> v n -> [v n]) -> [v n] -> [v n] -> [[v n]]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (\v n
v1 v n
v2 -> [v n
v1 v n -> n -> v n
forall (f :: * -> *) a.
(Functor f, Fractional a) =>
f a -> a -> f a
^/ n
3, (v n
v1 v n -> v n -> v n
forall a. Num a => v a -> v a -> v a
forall (f :: * -> *) a. (Additive f, Num a) => f a -> f a -> f a
^+^ v n
v2) v n -> n -> v n
forall (f :: * -> *) a.
(Functor f, Fractional a) =>
f a -> a -> f a
^/ n
3]) ([v n] -> [v n] -> [[v n]]) -> ([v n] -> [v n]) -> [v n] -> [[v n]]
forall a b. ([v n] -> a -> b) -> ([v n] -> a) -> [v n] -> b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> [v n] -> [v n]
forall a. HasCallStack => [a] -> [a]
tail) ([v n] -> [[v n]])
-> (Trail' Line v n -> [v n]) -> Trail' Line v n -> [[v n]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Segment Closed v n -> v n) -> [Segment Closed v n] -> [v n]
forall a b. (a -> b) -> [a] -> [b]
map Segment Closed v n -> v n
forall (v :: * -> *) n. Segment Closed v n -> v n
segOffset ([Segment Closed v n] -> [v n])
-> (Trail' Line v n -> [Segment Closed v n])
-> Trail' Line v n
-> [v n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Trail' Line v n -> [Segment Closed v n]
forall (v :: * -> *) n. Trail' Line v n -> [Segment Closed v n]
lineSegments
snowflake :: RealFloat n => Int -> Trail V2 n
snowflake :: forall n. RealFloat n => Int -> Trail V2 n
snowflake Int
n = Int
-> (Trail' Line V2 n -> Trail' Line V2 n)
-> Trail' Line V2 n
-> [Trail' Line V2 n]
forall a. Int -> (a -> a) -> a -> [a]
iterateN Int
3 (n -> Trail' Line V2 n -> Trail' Line V2 n
forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
n -> t -> t
rotateBy (-n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
3)) Trail' Line V2 n
edge
# mconcat
# glueLine
# wrapTrail
where edge :: Trail' Line V2 n
edge = Trail' Line V2 n -> [Trail' Line V2 n]
forall n. RealFloat n => Trail' Line V2 n -> [Trail' Line V2 n]
iterTrail Trail' Line V2 n
forall t n. (TrailLike t, V t ~ V2, N t ~ n) => t
koch [Trail' Line V2 n] -> Int -> Trail' Line V2 n
forall a. HasCallStack => [a] -> Int -> a
!! Int
n
data IterTrailConfig n = ITC { forall n. IterTrailConfig n -> Trail' Line V2 n
seed :: Trail' Line V2 n
, forall n. IterTrailConfig n -> Colour Double
color :: Colour Double
, forall n. IterTrailConfig n -> Int
iters :: Int
}
randITC ::
(MonadRandom m,
Ord n, Floating n, Random n) =>
m (IterTrailConfig n)
randITC :: forall (m :: * -> *) n.
(MonadRandom m, Ord n, Floating n, Random n) =>
m (IterTrailConfig n)
randITC = do
Int
nSegs <- (Int, Int) -> m Int
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR (Int
2,Int
5)
Bool
spline <- m Bool
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
[Point V2 n]
s <- [Vn [Point V2 n]] -> [Point V2 n]
[V2 n] -> [Point V2 n]
forall t. TrailLike t => [Vn t] -> t
fromOffsets ([V2 n] -> [Point V2 n]) -> m [V2 n] -> m [Point V2 n]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$>
Int -> m (V2 n) -> m [V2 n]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
nSegs (PrevDim (V2 n) -> FinalCoord (V2 n) -> V2 n
forall c. Coordinates c => PrevDim c -> FinalCoord c -> c
(^&) (PrevDim (V2 n) -> FinalCoord (V2 n) -> V2 n)
-> m (PrevDim (V2 n)) -> m (FinalCoord (V2 n) -> V2 n)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> (PrevDim (V2 n), PrevDim (V2 n)) -> m (PrevDim (V2 n))
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR (-PrevDim (V2 n)
1,PrevDim (V2 n)
1) m (FinalCoord (V2 n) -> V2 n) -> m (FinalCoord (V2 n)) -> m (V2 n)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> (FinalCoord (V2 n), FinalCoord (V2 n)) -> m (FinalCoord (V2 n))
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR (-FinalCoord (V2 n)
1,FinalCoord (V2 n)
1))
Colour Double
c <- Double -> Double -> Double -> Colour Double
forall b. (Ord b, Floating b) => b -> b -> b -> Colour b
sRGB (Double -> Double -> Double -> Colour Double)
-> m Double -> m (Double -> Double -> Colour Double)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> m Double
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom m (Double -> Double -> Colour Double)
-> m Double -> m (Double -> Colour Double)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m Double
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom m (Double -> Colour Double) -> m Double -> m (Colour Double)
forall a b. m (a -> b) -> m a -> m b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> m Double
forall a. Random a => m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => m a
getRandom
Int
i <- (Int, Int) -> m Int
forall a. Random a => (a, a) -> m a
forall (m :: * -> *) a. (MonadRandom m, Random a) => (a, a) -> m a
getRandomR (Int
3, Double -> Int
forall b. Integral b => Double -> b
forall a b. (RealFrac a, Integral b) => a -> b
floor (Double -> Double -> Double
forall a. Floating a => a -> a -> a
logBase (Int -> Double
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
nSegs :: Double) Double
10000))
let s' :: Trail' Line V2 n
s'
| Bool
spline = Bool -> [Point V2 n] -> Trail' Line V2 n
forall t (v :: * -> *) n.
(V t ~ v, N t ~ n, TrailLike t, Fractional (v n)) =>
Bool -> [Point v n] -> t
cubicSpline Bool
False [Point V2 n]
s
| Bool
otherwise = [Point (V (Trail' Line V2 n)) (N (Trail' Line V2 n))]
-> Trail' Line V2 n
forall t. TrailLike t => [Point (V t) (N t)] -> t
fromVertices [Point (V (Trail' Line V2 n)) (N (Trail' Line V2 n))]
[Point V2 n]
s
IterTrailConfig n -> m (IterTrailConfig n)
forall a. a -> m a
forall (m :: * -> *) a. Monad m => a -> m a
return (IterTrailConfig n -> m (IterTrailConfig n))
-> IterTrailConfig n -> m (IterTrailConfig n)
forall a b. (a -> b) -> a -> b
$ Trail' Line V2 n -> Colour Double -> Int -> IterTrailConfig n
forall n.
Trail' Line V2 n -> Colour Double -> Int -> IterTrailConfig n
ITC Trail' Line V2 n
s' Colour Double
c Int
i
drawITC :: (Renderable (Path V2 n) b, TypeableFloat n) =>
IterTrailConfig n -> QDiagram b V2 n Any
drawITC :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
IterTrailConfig n -> QDiagram b V2 n Any
drawITC (ITC Trail' Line V2 n
s Colour Double
c Int
i) = (Trail' Line V2 n -> [Trail' Line V2 n]
forall n. RealFloat n => Trail' Line V2 n -> [Trail' Line V2 n]
iterTrail Trail' Line V2 n
s [Trail' Line V2 n] -> Int -> Trail' Line V2 n
forall a. HasCallStack => [a] -> Int -> a
!! Int
i) Trail' Line V2 n
-> (Trail' Line V2 n -> QDiagram b V2 n Any) -> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# Trail' Line V2 n -> QDiagram b V2 n Any
forall n b.
(TypeableFloat n, Renderable (Path V2 n) b) =>
Trail' Line V2 n -> QDiagram b V2 n Any
strokeLine QDiagram b V2 n Any
-> (QDiagram b V2 n Any -> QDiagram b V2 n Any)
-> QDiagram b V2 n Any
forall a b. a -> (a -> b) -> b
# Colour Double -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall n a.
(InSpace V2 n a, Typeable n, Floating n, HasStyle a) =>
Colour Double -> a -> a
lc Colour Double
c
drawITCScaled
:: (Renderable (Path V2 n) b, RealFloat n, Typeable n)
=> IterTrailConfig n -> QDiagram b V2 n Any
drawITCScaled :: forall n b.
(Renderable (Path V2 n) b, RealFloat n, Typeable n) =>
IterTrailConfig n -> QDiagram b V2 n Any
drawITCScaled IterTrailConfig n
itc
= IterTrailConfig n -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
IterTrailConfig n -> QDiagram b V2 n Any
drawITC IterTrailConfig n
itc
# sized (dims2D 4 4)
# centerXY
# pad 1.1
randIterGrid :: (Renderable (Path V2 n) b, Random n, TypeableFloat n) =>
IO (QDiagram b V2 n Any)
randIterGrid :: forall n b.
(Renderable (Path V2 n) b, Random n, TypeableFloat n) =>
IO (QDiagram b V2 n Any)
randIterGrid = do
[IterTrailConfig n]
itcs <- Rand StdGen [IterTrailConfig n] -> IO [IterTrailConfig n]
forall a. Rand StdGen a -> IO a
evalRandIO (Int
-> RandT StdGen Identity (IterTrailConfig n)
-> Rand StdGen [IterTrailConfig n]
forall (m :: * -> *) a. Applicative m => Int -> m a -> m [a]
replicateM Int
25 RandT StdGen Identity (IterTrailConfig n)
forall (m :: * -> *) n.
(MonadRandom m, Ord n, Floating n, Random n) =>
m (IterTrailConfig n)
randITC)
QDiagram b V2 n Any -> IO (QDiagram b V2 n Any)
forall a. a -> IO a
forall (m :: * -> *) a. Monad m => a -> m a
return ([QDiagram b V2 n Any] -> QDiagram b V2 n Any
forall n b.
TypeableFloat n =>
[QDiagram b V2 n Any] -> QDiagram b V2 n Any
LG.gridCat ([QDiagram b V2 n Any] -> QDiagram b V2 n Any)
-> ([IterTrailConfig n] -> [QDiagram b V2 n Any])
-> [IterTrailConfig n]
-> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (IterTrailConfig n -> QDiagram b V2 n Any)
-> [IterTrailConfig n] -> [QDiagram b V2 n Any]
forall a b. (a -> b) -> [a] -> [b]
map IterTrailConfig n -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, RealFloat n, Typeable n) =>
IterTrailConfig n -> QDiagram b V2 n Any
drawITCScaled ([IterTrailConfig n] -> QDiagram b V2 n Any)
-> [IterTrailConfig n] -> QDiagram b V2 n Any
forall a b. (a -> b) -> a -> b
$ [IterTrailConfig n]
itcs)