{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE Rank2Types #-}
{-# LANGUAGE ViewPatterns #-}
{-# OPTIONS_GHC -fno-warn-missing-methods #-}
module Diagrams.TwoD.Apollonian
(
Circle(..), mkCircle, center, radius
, descartes, other, initialConfig
, apollonian
, KissingSet(..), kissingSets, flipSelected, selectOthers
, apollonianTrees, apollonianTree
, drawCircle
, drawGasket
, apollonianGasket
) where
import Data.Complex
import qualified Data.Foldable as F
import Data.Maybe (catMaybes)
import Data.Tree
import Diagrams.Prelude hiding (center, radius)
import Control.Arrow (second, (&&&))
data Circle n = Circle
{ forall n. Circle n -> n
bend :: n
, forall n. Circle n -> Complex n
cb :: Complex n
}
deriving (Circle n -> Circle n -> Bool
(Circle n -> Circle n -> Bool)
-> (Circle n -> Circle n -> Bool) -> Eq (Circle n)
forall n. Eq n => Circle n -> Circle n -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: forall n. Eq n => Circle n -> Circle n -> Bool
== :: Circle n -> Circle n -> Bool
$c/= :: forall n. Eq n => Circle n -> Circle n -> Bool
/= :: Circle n -> Circle n -> Bool
Eq, Int -> Circle n -> ShowS
[Circle n] -> ShowS
Circle n -> String
(Int -> Circle n -> ShowS)
-> (Circle n -> String) -> ([Circle n] -> ShowS) -> Show (Circle n)
forall n. Show n => Int -> Circle n -> ShowS
forall n. Show n => [Circle n] -> ShowS
forall n. Show n => Circle n -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall n. Show n => Int -> Circle n -> ShowS
showsPrec :: Int -> Circle n -> ShowS
$cshow :: forall n. Show n => Circle n -> String
show :: Circle n -> String
$cshowList :: forall n. Show n => [Circle n] -> ShowS
showList :: [Circle n] -> ShowS
Show)
mkCircle :: Fractional n =>
n
-> P2 n
-> Circle n
mkCircle :: forall n. Fractional n => n -> P2 n -> Circle n
mkCircle n
r (P2 n -> (n, n)
forall n. P2 n -> (n, n)
unp2 -> (n
x,n
y)) = n -> Complex n -> Circle n
forall n. n -> Complex n -> Circle n
Circle (n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
r) (n
bn -> n -> n
forall a. Num a => a -> a -> a
*n
x n -> n -> Complex n
forall a. a -> a -> Complex a
:+ n
bn -> n -> n
forall a. Num a => a -> a -> a
*n
y)
where b :: n
b = n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
r
center :: Fractional n => Circle n -> P2 n
center :: forall n. Fractional n => Circle n -> P2 n
center (Circle n
b (n
cbx :+ n
cby)) = (n, n) -> P2 n
forall n. (n, n) -> P2 n
p2 (n
cbx n -> n -> n
forall a. Fractional a => a -> a -> a
/ n
b, n
cby n -> n -> n
forall a. Fractional a => a -> a -> a
/ n
b)
radius :: Fractional n => Circle n -> n
radius :: forall n. Fractional n => Circle n -> n
radius = n -> n
forall a. Num a => a -> a
abs (n -> n) -> (Circle n -> n) -> Circle n -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. n -> n
forall a. Fractional a => a -> a
recip (n -> n) -> (Circle n -> n) -> Circle n -> n
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Circle n -> n
forall n. Circle n -> n
bend
liftF :: RealFloat n => (forall a. Floating a => a -> a) -> Circle n -> Circle n
liftF :: forall n.
RealFloat n =>
(forall a. Floating a => a -> a) -> Circle n -> Circle n
liftF forall a. Floating a => a -> a
f (Circle n
b Complex n
c) = n -> Complex n -> Circle n
forall n. n -> Complex n -> Circle n
Circle (n -> n
forall a. Floating a => a -> a
f n
b) (Complex n -> Complex n
forall a. Floating a => a -> a
f Complex n
c)
liftF2 :: RealFloat n => (forall a. Floating a => a -> a -> a) ->
Circle n -> Circle n -> Circle n
liftF2 :: forall n.
RealFloat n =>
(forall a. Floating a => a -> a -> a)
-> Circle n -> Circle n -> Circle n
liftF2 forall a. Floating a => a -> a -> a
f (Circle n
b1 Complex n
cb1) (Circle n
b2 Complex n
cb2) = n -> Complex n -> Circle n
forall n. n -> Complex n -> Circle n
Circle (n -> n -> n
forall a. Floating a => a -> a -> a
f n
b1 n
b2) (Complex n -> Complex n -> Complex n
forall a. Floating a => a -> a -> a
f Complex n
cb1 Complex n
cb2)
instance RealFloat n => Num (Circle n) where
+ :: Circle n -> Circle n -> Circle n
(+) = (forall a. Floating a => a -> a -> a)
-> Circle n -> Circle n -> Circle n
forall n.
RealFloat n =>
(forall a. Floating a => a -> a -> a)
-> Circle n -> Circle n -> Circle n
liftF2 a -> a -> a
forall a. Floating a => a -> a -> a
forall a. Num a => a -> a -> a
(+)
(-) = (forall a. Floating a => a -> a -> a)
-> Circle n -> Circle n -> Circle n
forall n.
RealFloat n =>
(forall a. Floating a => a -> a -> a)
-> Circle n -> Circle n -> Circle n
liftF2 (-)
* :: Circle n -> Circle n -> Circle n
(*) = (forall a. Floating a => a -> a -> a)
-> Circle n -> Circle n -> Circle n
forall n.
RealFloat n =>
(forall a. Floating a => a -> a -> a)
-> Circle n -> Circle n -> Circle n
liftF2 a -> a -> a
forall a. Floating a => a -> a -> a
forall a. Num a => a -> a -> a
(*)
negate :: Circle n -> Circle n
negate = (forall a. Floating a => a -> a) -> Circle n -> Circle n
forall n.
RealFloat n =>
(forall a. Floating a => a -> a) -> Circle n -> Circle n
liftF a -> a
forall a. Floating a => a -> a
forall a. Num a => a -> a
negate
abs :: Circle n -> Circle n
abs = (forall a. Floating a => a -> a) -> Circle n -> Circle n
forall n.
RealFloat n =>
(forall a. Floating a => a -> a) -> Circle n -> Circle n
liftF a -> a
forall a. Floating a => a -> a
forall a. Num a => a -> a
abs
fromInteger :: Integer -> Circle n
fromInteger Integer
n = n -> Complex n -> Circle n
forall n. n -> Complex n -> Circle n
Circle (Integer -> n
forall a. Num a => Integer -> a
fromInteger Integer
n) (Integer -> Complex n
forall a. Num a => Integer -> a
fromInteger Integer
n)
instance RealFloat n => Fractional (Circle n) where
/ :: Circle n -> Circle n -> Circle n
(/) = (forall a. Floating a => a -> a -> a)
-> Circle n -> Circle n -> Circle n
forall n.
RealFloat n =>
(forall a. Floating a => a -> a -> a)
-> Circle n -> Circle n -> Circle n
liftF2 a -> a -> a
forall a. Floating a => a -> a -> a
forall a. Fractional a => a -> a -> a
(/)
recip :: Circle n -> Circle n
recip = (forall a. Floating a => a -> a) -> Circle n -> Circle n
forall n.
RealFloat n =>
(forall a. Floating a => a -> a) -> Circle n -> Circle n
liftF a -> a
forall a. Floating a => a -> a
forall a. Fractional a => a -> a
recip
instance RealFloat n => Floating (Circle n) where
sqrt :: Circle n -> Circle n
sqrt = (forall a. Floating a => a -> a) -> Circle n -> Circle n
forall n.
RealFloat n =>
(forall a. Floating a => a -> a) -> Circle n -> Circle n
liftF a -> a
forall a. Floating a => a -> a
sqrt
descartes :: Floating n => [n] -> [n]
descartes :: forall n. Floating n => [n] -> [n]
descartes [n
b1,n
b2,n
b3] = [n
r n -> n -> n
forall a. Num a => a -> a -> a
+ n
s, -n
r n -> n -> n
forall a. Num a => a -> a -> a
+ n
s]
where r :: n
r = n
2 n -> n -> n
forall a. Num a => a -> a -> a
* n -> n
forall a. Floating a => a -> a
sqrt (n
b1n -> n -> n
forall a. Num a => a -> a -> a
*n
b2 n -> n -> n
forall a. Num a => a -> a -> a
+ n
b1n -> n -> n
forall a. Num a => a -> a -> a
*n
b3 n -> n -> n
forall a. Num a => a -> a -> a
+ n
b2n -> n -> n
forall a. Num a => a -> a -> a
*n
b3)
s :: n
s = n
b1n -> n -> n
forall a. Num a => a -> a -> a
+n
b2n -> n -> n
forall a. Num a => a -> a -> a
+n
b3
descartes [n]
_ = String -> [n]
forall a. HasCallStack => String -> a
error String
"descartes must be called on a list of length 3"
other :: Num n => [n] -> n -> n
other :: forall n. Num n => [n] -> n -> n
other [n]
xs n
x = n
2 n -> n -> n
forall a. Num a => a -> a -> a
* [n] -> n
forall a. Num a => [a] -> a
forall (t :: * -> *) a. (Foldable t, Num a) => t a -> a
sum [n]
xs n -> n -> n
forall a. Num a => a -> a -> a
- n
x
initialConfig :: RealFloat n => n -> n -> n -> [Circle n]
initialConfig :: forall n. RealFloat n => n -> n -> n -> [Circle n]
initialConfig n
b1 n
b2 n
b3 = [Circle n]
cs [Circle n] -> [Circle n] -> [Circle n]
forall a. [a] -> [a] -> [a]
++ [Circle n
c4]
where cs :: [Circle n]
cs = [n -> Complex n -> Circle n
forall n. n -> Complex n -> Circle n
Circle n
b1 Complex n
0, n -> Complex n -> Circle n
forall n. n -> Complex n -> Circle n
Circle n
b2 ((n
b2n -> n -> n
forall a. Fractional a => a -> a -> a
/n
b1 n -> n -> n
forall a. Num a => a -> a -> a
+ n
1) n -> n -> Complex n
forall a. a -> a -> Complex a
:+ n
0), n -> Complex n -> Circle n
forall n. n -> Complex n -> Circle n
Circle n
b3 Complex n
cb3]
a :: n
a = n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
b1 n -> n -> n
forall a. Num a => a -> a -> a
+ n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
b2
b :: n
b = n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
b1 n -> n -> n
forall a. Num a => a -> a -> a
+ n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
b3
c :: n
c = n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
b2 n -> n -> n
forall a. Num a => a -> a -> a
+ n
1n -> n -> n
forall a. Fractional a => a -> a -> a
/n
b3
x :: n
x = (n
bn -> n -> n
forall a. Num a => a -> a -> a
*n
b n -> n -> n
forall a. Num a => a -> a -> a
+ n
an -> n -> n
forall a. Num a => a -> a -> a
*n
a n -> n -> n
forall a. Num a => a -> a -> a
- n
cn -> n -> n
forall a. Num a => a -> a -> a
*n
c)n -> n -> n
forall a. Fractional a => a -> a -> a
/(n
2n -> n -> n
forall a. Num a => a -> a -> a
*n
a)
y :: n
y = n -> n
forall a. Floating a => a -> a
sqrt (n
bn -> n -> n
forall a. Num a => a -> a -> a
*n
b n -> n -> n
forall a. Num a => a -> a -> a
- n
xn -> n -> n
forall a. Num a => a -> a -> a
*n
x)
cb3 :: Complex n
cb3 = n
b3n -> n -> n
forall a. Num a => a -> a -> a
*n
x n -> n -> Complex n
forall a. a -> a -> Complex a
:+ n
b3n -> n -> n
forall a. Num a => a -> a -> a
*n
y
[Circle n
c4,Circle n
_] = [Circle n] -> [Circle n]
forall n. Floating n => [n] -> [n]
descartes [Circle n]
cs
select :: [a] -> [(a, [a])]
select :: forall a. [a] -> [(a, [a])]
select [] = []
select (a
x:[a]
xs) = (a
x,[a]
xs) (a, [a]) -> [(a, [a])] -> [(a, [a])]
forall a. a -> [a] -> [a]
: (((a, [a]) -> (a, [a])) -> [(a, [a])] -> [(a, [a])]
forall a b. (a -> b) -> [a] -> [b]
map (((a, [a]) -> (a, [a])) -> [(a, [a])] -> [(a, [a])])
-> (([a] -> [a]) -> (a, [a]) -> (a, [a]))
-> ([a] -> [a])
-> [(a, [a])]
-> [(a, [a])]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([a] -> [a]) -> (a, [a]) -> (a, [a])
forall b c d. (b -> c) -> (d, b) -> (d, c)
forall (a :: * -> * -> *) b c d.
Arrow a =>
a b c -> a (d, b) (d, c)
second) (a
xa -> [a] -> [a]
forall a. a -> [a] -> [a]
:) ([a] -> [(a, [a])]
forall a. [a] -> [(a, [a])]
select [a]
xs)
data KissingSet n = KS { forall n. KissingSet n -> n
selected :: n, forall n. KissingSet n -> [n]
others :: [n] }
deriving (Int -> KissingSet n -> ShowS
[KissingSet n] -> ShowS
KissingSet n -> String
(Int -> KissingSet n -> ShowS)
-> (KissingSet n -> String)
-> ([KissingSet n] -> ShowS)
-> Show (KissingSet n)
forall n. Show n => Int -> KissingSet n -> ShowS
forall n. Show n => [KissingSet n] -> ShowS
forall n. Show n => KissingSet n -> String
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: forall n. Show n => Int -> KissingSet n -> ShowS
showsPrec :: Int -> KissingSet n -> ShowS
$cshow :: forall n. Show n => KissingSet n -> String
show :: KissingSet n -> String
$cshowList :: forall n. Show n => [KissingSet n] -> ShowS
showList :: [KissingSet n] -> ShowS
Show)
kissingSets :: [n] -> [KissingSet n]
kissingSets :: forall n. [n] -> [KissingSet n]
kissingSets = ((n, [n]) -> KissingSet n) -> [(n, [n])] -> [KissingSet n]
forall a b. (a -> b) -> [a] -> [b]
map ((n -> [n] -> KissingSet n) -> (n, [n]) -> KissingSet n
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry n -> [n] -> KissingSet n
forall n. n -> [n] -> KissingSet n
KS) ([(n, [n])] -> [KissingSet n])
-> ([n] -> [(n, [n])]) -> [n] -> [KissingSet n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [n] -> [(n, [n])]
forall a. [a] -> [(a, [a])]
select
flipSelected :: Num n => KissingSet n -> KissingSet n
flipSelected :: forall n. Num n => KissingSet n -> KissingSet n
flipSelected (KS n
c [n]
cs) = n -> [n] -> KissingSet n
forall n. n -> [n] -> KissingSet n
KS ([n] -> n -> n
forall n. Num n => [n] -> n -> n
other [n]
cs n
c) [n]
cs
selectOthers :: KissingSet n -> [KissingSet n]
selectOthers :: forall n. KissingSet n -> [KissingSet n]
selectOthers (KS n
c [n]
cs) = [ n -> [n] -> KissingSet n
forall n. n -> [n] -> KissingSet n
KS n
c' (n
cn -> [n] -> [n]
forall a. a -> [a] -> [a]
:[n]
cs') | (n
c',[n]
cs') <- [n] -> [(n, [n])]
forall a. [a] -> [(a, [a])]
select [n]
cs ]
apollonian :: RealFloat n => n -> [Circle n] -> [Circle n]
apollonian :: forall n. RealFloat n => n -> [Circle n] -> [Circle n]
apollonian n
thresh [Circle n]
cs
= ([Circle n]
cs[Circle n] -> [Circle n] -> [Circle n]
forall a. [a] -> [a] -> [a]
++)
([Circle n] -> [Circle n])
-> ([Circle n] -> [Circle n]) -> [Circle n] -> [Circle n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [[Circle n]] -> [Circle n]
forall (t :: * -> *) a. Foldable t => t [a] -> [a]
concat
([[Circle n]] -> [Circle n])
-> ([Circle n] -> [[Circle n]]) -> [Circle n] -> [Circle n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Tree (KissingSet (Circle n)) -> [Circle n])
-> [Tree (KissingSet (Circle n))] -> [[Circle n]]
forall a b. (a -> b) -> [a] -> [b]
map ([Circle n]
-> (Tree (Circle n) -> [Circle n])
-> Maybe (Tree (Circle n))
-> [Circle n]
forall b a. b -> (a -> b) -> Maybe a -> b
maybe [] Tree (Circle n) -> [Circle n]
forall a. Tree a -> [a]
flatten (Maybe (Tree (Circle n)) -> [Circle n])
-> (Tree (KissingSet (Circle n)) -> Maybe (Tree (Circle n)))
-> Tree (KissingSet (Circle n))
-> [Circle n]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Circle n -> Bool) -> Tree (Circle n) -> Maybe (Tree (Circle n))
forall a. (a -> Bool) -> Tree a -> Maybe (Tree a)
prune Circle n -> Bool
p (Tree (Circle n) -> Maybe (Tree (Circle n)))
-> (Tree (KissingSet (Circle n)) -> Tree (Circle n))
-> Tree (KissingSet (Circle n))
-> Maybe (Tree (Circle n))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (KissingSet (Circle n) -> Circle n)
-> Tree (KissingSet (Circle n)) -> Tree (Circle n)
forall a b. (a -> b) -> Tree a -> Tree b
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap KissingSet (Circle n) -> Circle n
forall n. KissingSet n -> n
selected)
([Tree (KissingSet (Circle n))] -> [[Circle n]])
-> ([Circle n] -> [Tree (KissingSet (Circle n))])
-> [Circle n]
-> [[Circle n]]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Circle n] -> [Tree (KissingSet (Circle n))]
forall n.
RealFloat n =>
[Circle n] -> [Tree (KissingSet (Circle n))]
apollonianTrees
([Circle n] -> [Circle n]) -> [Circle n] -> [Circle n]
forall a b. (a -> b) -> a -> b
$ [Circle n]
cs
where
p :: Circle n -> Bool
p Circle n
c = Circle n -> n
forall n. Fractional n => Circle n -> n
radius Circle n
c n -> n -> Bool
forall a. Ord a => a -> a -> Bool
>= n
thresh
apollonianTrees :: RealFloat n => [Circle n] -> [Tree (KissingSet (Circle n))]
apollonianTrees :: forall n.
RealFloat n =>
[Circle n] -> [Tree (KissingSet (Circle n))]
apollonianTrees = (KissingSet (Circle n) -> Tree (KissingSet (Circle n)))
-> [KissingSet (Circle n)] -> [Tree (KissingSet (Circle n))]
forall a b. (a -> b) -> [a] -> [b]
map (KissingSet (Circle n) -> Tree (KissingSet (Circle n))
forall n.
RealFloat n =>
KissingSet (Circle n) -> Tree (KissingSet (Circle n))
apollonianTree (KissingSet (Circle n) -> Tree (KissingSet (Circle n)))
-> (KissingSet (Circle n) -> KissingSet (Circle n))
-> KissingSet (Circle n)
-> Tree (KissingSet (Circle n))
forall b c a. (b -> c) -> (a -> b) -> a -> c
. KissingSet (Circle n) -> KissingSet (Circle n)
forall n. Num n => KissingSet n -> KissingSet n
flipSelected) ([KissingSet (Circle n)] -> [Tree (KissingSet (Circle n))])
-> ([Circle n] -> [KissingSet (Circle n)])
-> [Circle n]
-> [Tree (KissingSet (Circle n))]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [Circle n] -> [KissingSet (Circle n)]
forall n. [n] -> [KissingSet n]
kissingSets
apollonianTree :: RealFloat n => KissingSet (Circle n) -> Tree (KissingSet (Circle n))
apollonianTree :: forall n.
RealFloat n =>
KissingSet (Circle n) -> Tree (KissingSet (Circle n))
apollonianTree = (KissingSet (Circle n)
-> (KissingSet (Circle n), [KissingSet (Circle n)]))
-> KissingSet (Circle n) -> Tree (KissingSet (Circle n))
forall b a. (b -> (a, [b])) -> b -> Tree a
unfoldTree (KissingSet (Circle n) -> KissingSet (Circle n)
forall a. a -> a
id (KissingSet (Circle n) -> KissingSet (Circle n))
-> (KissingSet (Circle n) -> [KissingSet (Circle n)])
-> KissingSet (Circle n)
-> (KissingSet (Circle n), [KissingSet (Circle n)])
forall b c c'. (b -> c) -> (b -> c') -> b -> (c, c')
forall (a :: * -> * -> *) b c c'.
Arrow a =>
a b c -> a b c' -> a b (c, c')
&&& ((KissingSet (Circle n) -> KissingSet (Circle n))
-> [KissingSet (Circle n)] -> [KissingSet (Circle n)]
forall a b. (a -> b) -> [a] -> [b]
map KissingSet (Circle n) -> KissingSet (Circle n)
forall n. Num n => KissingSet n -> KissingSet n
flipSelected ([KissingSet (Circle n)] -> [KissingSet (Circle n)])
-> (KissingSet (Circle n) -> [KissingSet (Circle n)])
-> KissingSet (Circle n)
-> [KissingSet (Circle n)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. KissingSet (Circle n) -> [KissingSet (Circle n)]
forall n. KissingSet n -> [KissingSet n]
selectOthers))
prune :: (a -> Bool) -> Tree a -> Maybe (Tree a)
prune :: forall a. (a -> Bool) -> Tree a -> Maybe (Tree a)
prune a -> Bool
p (Node a
a [Tree a]
ts)
| Bool -> Bool
not (a -> Bool
p a
a) = Maybe (Tree a)
forall a. Maybe a
Nothing
| Bool
otherwise = Tree a -> Maybe (Tree a)
forall a. a -> Maybe a
Just (Tree a -> Maybe (Tree a)) -> Tree a -> Maybe (Tree a)
forall a b. (a -> b) -> a -> b
$ a -> [Tree a] -> Tree a
forall a. a -> [Tree a] -> Tree a
Node a
a ([Maybe (Tree a)] -> [Tree a]
forall a. [Maybe a] -> [a]
catMaybes ((Tree a -> Maybe (Tree a)) -> [Tree a] -> [Maybe (Tree a)]
forall a b. (a -> b) -> [a] -> [b]
map ((a -> Bool) -> Tree a -> Maybe (Tree a)
forall a. (a -> Bool) -> Tree a -> Maybe (Tree a)
prune a -> Bool
p) [Tree a]
ts))
drawCircle :: (Renderable (Path V2 n) b, TypeableFloat n) =>
Circle n -> QDiagram b V2 n Any
drawCircle :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Circle n -> QDiagram b V2 n Any
drawCircle Circle n
c = n -> QDiagram b V2 n Any
forall t n.
(TrailLike t, V t ~ V2, N t ~ n, Transformable t) =>
n -> t
circle (Circle n -> n
forall n. Fractional n => Circle n -> n
radius Circle n
c) 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
# Point V2 n -> QDiagram b V2 n Any -> QDiagram b V2 n Any
forall (v :: * -> *) n t.
(InSpace v n t, HasOrigin t) =>
Point v n -> t -> t
moveTo (Circle n -> Point V2 n
forall n. Fractional n => Circle n -> P2 n
center Circle n
c)
# fcA transparent
drawGasket :: (Renderable (Path V2 n) b, TypeableFloat n) =>
[Circle n] -> QDiagram b V2 n Any
drawGasket :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Circle n] -> QDiagram b V2 n Any
drawGasket [Circle n]
cs = (Circle n -> QDiagram b V2 n Any)
-> [Circle n] -> QDiagram b V2 n Any
forall m a. Monoid m => (a -> m) -> [a] -> m
forall (t :: * -> *) m a.
(Foldable t, Monoid m) =>
(a -> m) -> t a -> m
F.foldMap Circle n -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
Circle n -> QDiagram b V2 n Any
drawCircle [Circle n]
cs
apollonianGasket :: (Renderable (Path V2 n) b, TypeableFloat n)
=> n -> n -> n -> n -> QDiagram b V2 n Any
apollonianGasket :: forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
n -> n -> n -> n -> QDiagram b V2 n Any
apollonianGasket n
thresh n
b1 n
b2 n
b3 = [Circle n] -> QDiagram b V2 n Any
forall n b.
(Renderable (Path V2 n) b, TypeableFloat n) =>
[Circle n] -> QDiagram b V2 n Any
drawGasket ([Circle n] -> QDiagram b V2 n Any)
-> ([Circle n] -> [Circle n]) -> [Circle n] -> QDiagram b V2 n Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. n -> [Circle n] -> [Circle n]
forall n. RealFloat n => n -> [Circle n] -> [Circle n]
apollonian n
thresh ([Circle n] -> QDiagram b V2 n Any)
-> [Circle n] -> QDiagram b V2 n Any
forall a b. (a -> b) -> a -> b
$ (n -> n -> n -> [Circle n]
forall n. RealFloat n => n -> n -> n -> [Circle n]
initialConfig n
b1 n
b2 n
b3)