{-|
Module      : TgraphExamples
Description : Examples of tilings represented with Tgraphs and their diagrams 
Copyright   : (c) Chris Reade, 2021
License     : BSD-style
Maintainer  : chrisreade@mac.com
Stability   : experimental

-}
{-# LANGUAGE NoMonomorphismRestriction #-}
{-# LANGUAGE FlexibleContexts          #-}
{-# LANGUAGE TypeFamilies              #-}
{-# LANGUAGE TupleSections             #-}

module TgraphExamples
  (-- * Some Layout tools
    padBorder
  , chunks
  , arrangeRowsGap
  , arrangeRows
  , labelAt
    -- *  Tgraphs for 7 vertex types
  , sunGraph 
  , jackGraph
  , kingGraph
  , queenGraph
  , aceGraph
  , deuceGraph
  , starGraph
    -- *  Further Basic Tgraphs
  , kiteGraph
  , dartGraph
  , fool
  , foolD
  , foolDminus
  , foolDs
  , sunDs
  , kiteDs
  , dartDs
  , dartD4  
  , sun3Dart 
    -- *  Some Simple Figures
  , foolFig
  , foolAndFoolD
  , figSunD3D2
    -- *  Figures for 7 vertex types
  , vertexTypesFig
  , forceVFigures
    -- * Partial Composition figures
  , pCompFig1
  , pCompFig2
  , pCompFig
    -- * Forced Tgraph figures
  , forceFoolDminus
  , forceDartD5Fig
  , forceKiteD5Fig
  , forceSunD5Fig
  , forceFig
    -- *  Removed faces (forcing and composing)
  , brokenDart
  , badlyBrokenDart
  , brokenDartFig
  , badlyBrokenDartFig
  , removeIncompletesFig
    -- *  Incorrect Tgraphs
  , mistake
  , mistake1
    -- * superForce Figure
  , superForceFig
  , superForceRocketsFig
    -- *  Tgraphs with Boundary faces
  , boundaryFDart4
  , boundaryFDart5
  , boundaryFDart4Fig
  , boundaryFDart5Fig
  , boundaryGapFDart4
  , boundaryGapFDart5
  , boundaryGap4Fig
  , boundaryGap5Fig
    -- *  Boundary coverings and empires
 , boundaryVCoveringFigs
 , boundaryECoveringFigs
 , kingECoveringFig
 , kingVCoveringFig 
 , kingEmpiresFig
 , kingEmpire1Fig
 , kingEmpire2Fig
 
  ) where

import Diagrams.Prelude
import Diagrams.TwoD.Text (Text)
-- import ChosenBackend (B)
import TileLib
import Tgraphs



-- |used for most diagrams to give border padding
-- 
--  When a specific Backend B is in scope, padBorder:: Diagram B -> Diagram B
padBorder :: Diagram2D b -> Diagram2D b
padBorder :: forall b. Diagram2D b -> Diagram2D b
padBorder = Double -> Diagram2D b -> Diagram2D b
forall (v :: * -> *) n m b.
(Metric v, OrderedField n, Monoid' m) =>
n -> QDiagram b v n m -> QDiagram b v n m
pad Double
1.2 (Diagram2D b -> Diagram2D b)
-> (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Diagram2D b -> Diagram2D b
forall (v :: * -> *) n a.
(InSpace v n a, R2 v, Fractional n, Alignable a, HasOrigin a) =>
a -> a
centerXY

-- |chunks n l -  split a list l into chunks of length n (n>0)
chunks::Int -> [a] -> [[a]]
chunks :: forall a. Vertex -> [a] -> [[a]]
chunks Vertex
n
  | Vertex
n Vertex -> Vertex -> Bool
forall a. Ord a => a -> a -> Bool
< Vertex
1 = [Char] -> [a] -> [[a]]
forall a. HasCallStack => [Char] -> a
error [Char]
"chunks: argument <1\n"
  | Bool
otherwise = [a] -> [[a]]
ch where
      ch :: [a] -> [[a]]
ch [] = []
      ch [a]
as = Vertex -> [a] -> [a]
forall a. Vertex -> [a] -> [a]
take Vertex
n [a]
as [a] -> [[a]] -> [[a]]
forall a. a -> [a] -> [a]
: [a] -> [[a]]
ch (Vertex -> [a] -> [a]
forall a. Vertex -> [a] -> [a]
drop Vertex
n [a]
as)

-- |arrangeRowsGap s n diags - arranges diags into n per row, centering each row horizontally,
-- with a seperation gap (horizontally and vertically) of s.
-- The result is a single diagram.
-- 
--  When a specific Backend B is in scope, arrangeRowsGap :: Double -> Int -> [Diagram B] -> Diagram B
arrangeRowsGap :: Double -> Int -> [Diagram2D b] -> Diagram2D b
arrangeRowsGap :: forall b. Double -> Vertex -> [Diagram2D b] -> Diagram2D b
arrangeRowsGap Double
s Vertex
n = Diagram2D b -> Diagram2D b
forall (v :: * -> *) n a.
(InSpace v n a, R2 v, Fractional n, Alignable a, HasOrigin a) =>
a -> a
centerY (Diagram2D b -> Diagram2D b)
-> ([Diagram2D b] -> Diagram2D b) -> [Diagram2D b] -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
vsep Double
s ([Diagram2D b] -> Diagram2D b)
-> ([Diagram2D b] -> [Diagram2D b]) -> [Diagram2D b] -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. ([Diagram2D b] -> Diagram2D b) -> [[Diagram2D b]] -> [Diagram2D b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Diagram2D b -> Diagram2D b
forall (v :: * -> *) n a.
(InSpace v n a, R1 v, Fractional n, Alignable a, HasOrigin a) =>
a -> a
centerX (Diagram2D b -> Diagram2D b)
-> ([Diagram2D b] -> Diagram2D b) -> [Diagram2D b] -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
s) ([[Diagram2D b]] -> [Diagram2D b])
-> ([Diagram2D b] -> [[Diagram2D b]])
-> [Diagram2D b]
-> [Diagram2D b]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Vertex -> [Diagram2D b] -> [[Diagram2D b]]
forall a. Vertex -> [a] -> [[a]]
chunks Vertex
n

-- |arrangeRows n diags - arranges diags into n per row, centering each row horizontally.
-- The result is a single diagram (seperation is 1 unit vertically and horizontally).
-- 
--  When a specific Backend B is in scope, arrangeRows :: Int -> [Diagram B] -> Diagram B
arrangeRows :: Int -> [Diagram2D b] -> Diagram2D b
arrangeRows :: forall b. Vertex -> [Diagram2D b] -> Diagram2D b
arrangeRows = Double -> Vertex -> [Diagram2D b] -> Diagram2D b
forall b. Double -> Vertex -> [Diagram2D b] -> Diagram2D b
arrangeRowsGap Double
1.0

-- |add a given label at a given point offset from the centre of the given diagram.
-- 
-- When a specific Backend B is in scope, labelAt :: Point V2 Double -> String -> Diagram B -> Diagram B
labelAt :: Renderable (Text Double) b => 
           Point V2 Double -> String -> Diagram2D b -> Diagram2D b
labelAt :: forall b.
Renderable (Text Double) b =>
Point V2 Double -> [Char] -> Diagram2D b -> Diagram2D b
labelAt Point V2 Double
p [Char]
l Diagram2D b
d = [Char] -> Diagram2D b
forall n b.
(TypeableFloat n, Renderable (Text n) b) =>
[Char] -> QDiagram b V2 n Any
baselineText [Char]
l Diagram2D b -> (Diagram2D b -> Diagram2D b) -> Diagram2D b
forall a b. a -> (a -> b) -> b
# Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, Typeable n, HasStyle a) =>
Measure n -> a -> a
fontSize (Double -> Measure Double
forall n. n -> Measure n
output Double
15) Diagram2D b -> (Diagram2D b -> Diagram2D b) -> Diagram2D b
forall a b. a -> (a -> b) -> b
# Point V2 Double -> Diagram2D b -> Diagram2D b
forall (v :: * -> *) n t.
(InSpace v n t, HasOrigin t) =>
Point v n -> t -> t
moveTo Point V2 Double
p Diagram2D b -> Diagram2D b -> Diagram2D b
forall a. Semigroup a => a -> a -> a
<> Diagram2D b
d
--labelAt p l d = baselineText l # fontSize (normalized 0.02) # moveTo p <> d


fool, foolD, foolDminus:: Tgraph
-- |fool: fool's kite - also called an ace.
fool :: Tgraph
fool = [TileFace] -> Tgraph
makeTgraph [(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
5,Vertex
2,Vertex
7),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
5,Vertex
6,Vertex
4),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
5,Vertex
4,Vertex
3),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
5,Vertex
3,Vertex
2),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
2,Vertex
3),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
3,Vertex
4)]
-- fool = makeTgraph [ RD (1,2,3), LD (1,3,4), RK (6,2,5), LK (6,3,2), RK (6,4,3), LK (6,7,4)]

-- |a once decomposed fool (= foolDs!!1)
foolD :: Tgraph
foolD = Tgraph -> Tgraph
decompose Tgraph
fool

-- |foolDminus: 3 faces removed from foolD - still a valid Tgraph
foolDminus :: Tgraph
foolDminus = [TileFace] -> Tgraph -> Tgraph
removeFaces [(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
5,Vertex
15,Vertex
13), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
5,Vertex
16,Vertex
15), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
7,Vertex
11,Vertex
2)] Tgraph
foolD
-- foolDminus = removeFaces [RD (6,15,13), LD (6,17,15), RK (5,11,2)] foolD

-- | an infinite list of decompositions of fool
foolDs :: [Tgraph]
foolDs :: [Tgraph]
foolDs = Tgraph -> [Tgraph]
decompositions Tgraph
fool

-- | diagram of just fool.
--
-- When a specific Backend B is in scope, foolFig :: Diagram B
foolFig :: (Renderable (Path V2 Double) b, Renderable (Text Double) b) => Diagram2D b
foolFig :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
foolFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> (Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
Measure Double -> (Patch -> Diagram2D b) -> a -> Diagram2D b
labelSize Measure Double
forall n. OrderedField n => Measure n
normal Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj Tgraph
fool

-- |diagram of fool with foolD.
-- 
-- When a specific Backend B is in scope, foolAndFoolD :: Diagram B
foolAndFoolD :: (Renderable (Path V2 Double) b, Renderable (Text Double) b) => Diagram2D b
foolAndFoolD :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
foolAndFoolD = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
1 [Double -> Diagram2D b -> Diagram2D b
forall (v :: * -> *) n a.
(InSpace v n a, Eq n, Fractional n, Transformable a) =>
n -> a -> a
scale Double
phi (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ (Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
(Patch -> Diagram2D b) -> a -> Diagram2D b
labelled Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj Tgraph
fool, (Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
(Patch -> Diagram2D b) -> a -> Diagram2D b
labelled Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj Tgraph
foolD]

-- |Tgraph for a sun (sun vertex type)
sunGraph :: Tgraph
sunGraph :: Tgraph
sunGraph = [TileFace] -> Tgraph
makeTgraph
             [ (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
2,Vertex
11), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
3,Vertex
2)
             , (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
4,Vertex
3) , (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
5,Vertex
4)
             , (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
6,Vertex
5) , (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
7,Vertex
6)
             , (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
8,Vertex
7) , (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
9,Vertex
8)
             , (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
10,Vertex
9), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
11,Vertex
10)
             ]
-- | an infinite list of decompositions of sunGraph
sunDs :: [Tgraph]
sunDs :: [Tgraph]
sunDs =  Tgraph -> [Tgraph]
decompositions Tgraph
sunGraph

-- |Figure for a 3 times decomposed sun with a 2 times decomposed sun.
-- 
-- When a specific Backend B is in scope, figSunD3D2 :: Diagram B
figSunD3D2 :: (Renderable (Path V2 Double) b, Renderable (Text Double) b) => Diagram2D b
figSunD3D2 :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
figSunD3D2 = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
1 [(Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
(Patch -> Diagram2D b) -> a -> Diagram2D b
labelled Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj (Tgraph -> Diagram2D b) -> Tgraph -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ [Tgraph]
sunDs [Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!! Vertex
3, Double -> Diagram2D b -> Diagram2D b
forall (v :: * -> *) n a.
(InSpace v n a, Eq n, Fractional n, Transformable a) =>
n -> a -> a
scale Double
phi (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ (Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
(Patch -> Diagram2D b) -> a -> Diagram2D b
labelled Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj (Tgraph -> Diagram2D b) -> Tgraph -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ [Tgraph]
sunDs [Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!! Vertex
2]

-- |Tgraph for kite
kiteGraph :: Tgraph
kiteGraph :: Tgraph
kiteGraph = [TileFace] -> Tgraph
makeTgraph [ (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
2,Vertex
4), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
3,Vertex
2)]

-- | an infinite list of decompositions of a kite
kiteDs :: [Tgraph]
kiteDs :: [Tgraph]
kiteDs = Tgraph -> [Tgraph]
decompositions Tgraph
kiteGraph

-- |Tgraph for a dart
dartGraph :: Tgraph
dartGraph :: Tgraph
dartGraph =  [TileFace] -> Tgraph
makeTgraph [ (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
2,Vertex
3), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
3,Vertex
4)]

-- | an infinite list of decompositions of a dart
dartDs :: [Tgraph]
dartDs :: [Tgraph]
dartDs =  Tgraph -> [Tgraph]
decompositions Tgraph
dartGraph

-- |Tgraph of 4 times decomposed dartGraph (used in several examples)
dartD4 :: Tgraph
dartD4 :: Tgraph
dartD4 = [Tgraph]
dartDs[Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!!Vertex
4




pCompFig1,pCompFig2,pCompFig :: Renderable (Path V2 Double) b => Diagram2D b
-- |diagram showing partial composition of a forced 3 times decomposed dart (with remainder faces in pale green).
-- 
-- When a specific Backend B is in scope, pCompFig1 :: Diagram B
pCompFig1 :: forall b. Renderable (Path V2 Double) b => Diagram2D b
pCompFig1 = Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
veryThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
5 ([Diagram2D b] -> Diagram2D b) -> [Diagram2D b] -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ [Vertex] -> [Diagram2D b] -> [Diagram2D b]
forall a.
(Transformable a, V a ~ V2, N a ~ Double) =>
[Vertex] -> [a] -> [a]
rotations [Vertex
1,Vertex
1] [Tgraph -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
draw Tgraph
fd3, Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
drawPCompose Tgraph
fd3]
            where fd3 :: Tgraph
fd3 = Tgraph -> Tgraph
forall a. Forcible a => a -> a
force (Tgraph -> Tgraph) -> Tgraph -> Tgraph
forall a b. (a -> b) -> a -> b
$ [Tgraph]
dartDs[Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!!Vertex
3
-- |diagram showing partial composition of a forced 3 times decomposed kite (with remainder faces in pale green).
-- 
-- When a specific Backend B is in scope, pCompFig2 :: Diagram B
pCompFig2 :: forall b. Renderable (Path V2 Double) b => Diagram2D b
pCompFig2 = Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
veryThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
5 [Tgraph -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
draw Tgraph
fk3, Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
drawPCompose Tgraph
fk3]
            where fk3 :: Tgraph
fk3 = Tgraph -> Tgraph
forall a. Forcible a => a -> a
force (Tgraph -> Tgraph) -> Tgraph -> Tgraph
forall a b. (a -> b) -> a -> b
$ [Tgraph]
kiteDs[Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!!Vertex
3
-- |diagram showing two partial compositions (with remainder faces in pale green).
-- 
-- When a specific Backend B is in scope, pCompFig :: Diagram B
pCompFig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
pCompFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
vsep Double
3 [Diagram2D b -> Diagram2D b
forall (v :: * -> *) n a.
(InSpace v n a, Fractional n, Traversable v, Alignable a,
 HasOrigin a) =>
a -> a
center Diagram2D b
forall b. Renderable (Path V2 Double) b => Diagram2D b
pCompFig1, Diagram2D b -> Diagram2D b
forall (v :: * -> *) n a.
(InSpace v n a, Fractional n, Traversable v, Alignable a,
 HasOrigin a) =>
a -> a
center Diagram2D b
forall b. Renderable (Path V2 Double) b => Diagram2D b
pCompFig2]


-- |diagram of foolDminus and the result of forcing.  
-- 
-- When a specific Backend B is in scope, forceFoolDminus :: Diagram B
forceFoolDminus :: (Renderable (Path V2 Double) b, Renderable (Text Double) b) => Diagram2D b
forceFoolDminus :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
forceFoolDminus = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
1 ([Diagram2D b] -> Diagram2D b) -> [Diagram2D b] -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ (Tgraph -> Diagram2D b) -> [Tgraph] -> [Diagram2D b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
(Patch -> Diagram2D b) -> a -> Diagram2D b
labelled Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj) [Tgraph
foolDminus, Tgraph -> Tgraph
forall a. Forcible a => a -> a
force Tgraph
foolDminus]


forceDartD5Fig,forceKiteD5Fig,forceSunD5Fig,forceFig :: Renderable (Path V2 Double) b => Diagram2D b
-- |diagram of forced 5 times decomposed dart.
-- 
-- When a specific Backend B is in scope, forceDartD5Fig :: Diagram B
forceDartD5Fig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
forceDartD5Fig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
ultraThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
drawForce (Tgraph -> Diagram2D b) -> Tgraph -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ [Tgraph]
dartDs [Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!! Vertex
5
-- |diagram of forced 5 times decomposed kite.
-- 
-- When a specific Backend B is in scope, forceKiteD5Fig :: Diagram B
forceKiteD5Fig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
forceKiteD5Fig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
ultraThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Angle Double -> Diagram2D b -> Diagram2D b
forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
Angle n -> t -> t
rotate (Vertex -> Angle Double
ttangle Vertex
1) (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
drawForce (Tgraph -> Diagram2D b) -> Tgraph -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ [Tgraph]
kiteDs[Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!!Vertex
5
-- |diagram of forced 5 times decomposed sun.
-- 
-- When a specific Backend B is in scope, forceSunD5Fig :: Diagram B
forceSunD5Fig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
forceSunD5Fig =  Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
ultraThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
drawForce (Tgraph -> Diagram2D b) -> Tgraph -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ [Tgraph]
sunDs [Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!! Vertex
5
-- |diagram of forced 5 times decomposed dart (left) and kite (right).
-- 
-- When a specific Backend B is in scope, forceFig :: Diagram B
forceFig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
forceFig = Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
1 [Diagram2D b
forall b. Renderable (Path V2 Double) b => Diagram2D b
forceDartD5Fig,Diagram2D b
forall b. Renderable (Path V2 Double) b => Diagram2D b
forceKiteD5Fig]

-- |brokenDart is a 4 times decomposed dart (dartD4) with 5 halftile faces removed.
-- Forcing will repair to produce the same Tgraph as force dartD4.
-- This graph can also be repeatedly composed (without forcing) to get a maximal Tgraph.
brokenDart :: Tgraph
brokenDart :: Tgraph
brokenDart = [TileFace] -> Tgraph -> Tgraph
removeFaces [TileFace]
forall {a} {b} {c}. (Num a, Num b, Num c) => [HalfTile (a, b, c)]
deleted Tgraph
dartD4 where
  deleted :: [HalfTile (a, b, c)]
deleted = [(a, b, c) -> HalfTile (a, b, c)
forall rep. rep -> HalfTile rep
RK (a
2,b
16,c
33),(a, b, c) -> HalfTile (a, b, c)
forall rep. rep -> HalfTile rep
LD (a
15,b
33,c
16),(a, b, c) -> HalfTile (a, b, c)
forall rep. rep -> HalfTile rep
RK (a
16,b
66,c
15),(a, b, c) -> HalfTile (a, b, c)
forall rep. rep -> HalfTile rep
LK (a
16,b
67,c
66),(a, b, c) -> HalfTile (a, b, c)
forall rep. rep -> HalfTile rep
LK (a
5,b
15,c
66)]

{-| badlyBrokenDart has more faces removed from brokenDart.
This will also get repaired by forcing (to produce the same as force dartD4).
However it will fail to produce a valid Tgraph if composed twice without forcing. 
-}
badlyBrokenDart :: Tgraph
badlyBrokenDart :: Tgraph
badlyBrokenDart = [TileFace] -> Tgraph -> Tgraph
removeFaces [TileFace]
forall {a} {b} {c}. (Num a, Num b, Num c) => [HalfTile (a, b, c)]
deleted Tgraph
bbd where
  deleted :: [HalfTile (a, b, c)]
deleted = [(a, b, c) -> HalfTile (a, b, c)
forall rep. rep -> HalfTile rep
RK (a
6,b
28,c
54)]
  bbd :: Tgraph
bbd = [Vertex] -> Tgraph -> Tgraph
removeVertices [Vertex
63,Vertex
37] Tgraph
brokenDart
--  deleted = RK(6,28,54):filter (isAtV 63) (faces brokenDart)

-- |brokenDartFig shows the faces removed from dartD4 to make brokenDart and badlyBrokenDart.
-- 
-- When a specific Backend B is in scope, brokenDartFig :: Diagram B
brokenDartFig  :: (Renderable (Path V2 Double) b, Renderable (Text Double) b) => Diagram2D b
brokenDartFig :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
brokenDartFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
thin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
1 ([Diagram2D b] -> Diagram2D b) -> [Diagram2D b] -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ (Tgraph -> Diagram2D b) -> [Tgraph] -> [Diagram2D b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
(Patch -> Diagram2D b) -> a -> Diagram2D b
labelled Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj) [Tgraph
dartD4, Tgraph
brokenDart, Tgraph
badlyBrokenDart]

-- |badlyBrokenDartFig shows badlyBrokenDart, followed by its composition, followed by the faces 
-- that would result from an unchecked second composition which are not tile-connected.
-- (Simply applying compose twice to badlyBrokenDart will raise an error).
-- 
-- When a specific Backend B is in scope, badlyBrokenDartFig :: Diagram B
badlyBrokenDartFig :: (Renderable (Path V2 Double) b, Renderable (Text Double) b) => Diagram2D b
badlyBrokenDartFig :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
badlyBrokenDartFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
thin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
1 ([Diagram2D b] -> Diagram2D b) -> [Diagram2D b] -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ (VPatch -> Diagram2D b) -> [VPatch] -> [Diagram2D b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Patch -> Diagram2D b) -> VPatch -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
(Patch -> Diagram2D b) -> a -> Diagram2D b
labelled Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj) [VPatch
vp, VPatch
vpComp, VPatch
vpFailed] where
    vp :: VPatch
vp = Tgraph -> VPatch
makeVP Tgraph
badlyBrokenDart
    comp :: Tgraph
comp = Tgraph -> Tgraph
compose Tgraph
badlyBrokenDart
    vpComp :: VPatch
vpComp = VPatch -> [TileFace] -> VPatch
restrictVP VPatch
vp ([TileFace] -> VPatch) -> [TileFace] -> VPatch
forall a b. (a -> b) -> a -> b
$ Tgraph -> [TileFace]
faces (Tgraph -> [TileFace]) -> Tgraph -> [TileFace]
forall a b. (a -> b) -> a -> b
$ Tgraph
comp
    vpFailed :: VPatch
vpFailed  = VPatch -> [TileFace] -> VPatch
restrictVP VPatch
vp ([TileFace] -> VPatch) -> [TileFace] -> VPatch
forall a b. (a -> b) -> a -> b
$ Tgraph -> [TileFace]
composedFaces Tgraph
comp

-- |figure showing the result of removing incomplete tiles (those that do not have their matching halftile)
-- to a 3 times decomposed sun.
-- 
-- When a specific Backend B is in scope, removeIncompletesFig :: Diagram B
removeIncompletesFig :: Renderable (Path V2 Double) b => Diagram2D b
removeIncompletesFig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
removeIncompletesFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Tgraph -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj (Tgraph -> Diagram2D b) -> Tgraph -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ [TileFace] -> Tgraph -> Tgraph
removeFaces (Tgraph -> [TileFace]
boundaryJoinFaces Tgraph
g) Tgraph
g where 
    g :: Tgraph
g = [Tgraph]
sunDs [Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!! Vertex
3


-- |mistake is a legal but incorrect Tgraph - a kite with 2 darts on its long edges
mistake:: Tgraph
mistake :: Tgraph
mistake = [TileFace] -> Tgraph
makeTgraph [(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
2,Vertex
4), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
3,Vertex
2), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
3,Vertex
1,Vertex
5), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
4,Vertex
6,Vertex
1), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
3,Vertex
5,Vertex
7), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
4,Vertex
8,Vertex
6)]

-- |mistake1 is a kite bordered by 2 half darts (subgraph of mistake and still incorrect)
mistake1:: Tgraph
mistake1 :: Tgraph
mistake1 = [TileFace] -> Tgraph
makeTgraph [(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
2,Vertex
4), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
3,Vertex
2), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
3,Vertex
1,Vertex
5), (Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
4,Vertex
6,Vertex
1)]

-- *  Figures for 7 vertex types

-- | vertexTypesFig is 7 vertex types in a single diagram as a row.
-- 
-- When a specific Backend B is in scope, vertexTypesFig :: Diagram B
vertexTypesFig :: (Renderable (Path V2 Double) b, Renderable (Text Double) b) => Diagram2D b
vertexTypesFig :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
vertexTypesFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
1 [Diagram2D b]
forall {b}.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
[Diagram2D b]
lTypeFigs
 where
 lTypeFigs :: [Diagram2D b]
lTypeFigs = ([Char] -> Diagram2D b -> Diagram2D b)
-> [[Char]] -> [Diagram2D b] -> [Diagram2D b]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith (Point V2 Double -> [Char] -> Diagram2D b -> Diagram2D b
forall b.
Renderable (Text Double) b =>
Point V2 Double -> [Char] -> Diagram2D b -> Diagram2D b
labelAt ((Double, Double) -> Point V2 Double
forall n. (n, n) -> P2 n
p2 (Double
0,-Double
2.2))) [[Char]
"sun",[Char]
"star",[Char]
"jack",[Char]
"queen",[Char]
"king",[Char]
"ace",[Char]
"deuce"] [Diagram2D b]
forall {b}.
Renderable (Path V2 Double) b =>
[QDiagram b V2 Double Any]
vTypeFigs
 vTypeFigs :: [QDiagram b V2 Double Any]
vTypeFigs = (Tgraph -> (Vertex, Vertex) -> QDiagram b V2 Double Any)
-> [Tgraph] -> [(Vertex, Vertex)] -> [QDiagram b V2 Double Any]
forall a b c. (a -> b -> c) -> [a] -> [b] -> [c]
zipWith Tgraph -> (Vertex, Vertex) -> QDiagram b V2 Double Any
forall {b}.
Renderable (Path V2 Double) b =>
Tgraph -> (Vertex, Vertex) -> QDiagram b V2 Double Any
drawVertex
               [Tgraph
sunGraph, Tgraph
starGraph, Tgraph
jackGraph, Tgraph
queenGraph, Tgraph
kingGraph, Tgraph
aceGraph,  Tgraph
deuceGraph]
               [(Vertex
1,Vertex
2),    (Vertex
1,Vertex
2),     (Vertex
1,Vertex
2),     (Vertex
1,Vertex
2),      (Vertex
1,Vertex
2),     (Vertex
3,Vertex
6),     (Vertex
2,Vertex
6)] -- alignments
 drawVertex :: Tgraph -> (Vertex, Vertex) -> QDiagram b V2 Double Any
drawVertex Tgraph
g (Vertex, Vertex)
alm = (VPatch -> QDiagram b V2 Double Any)
-> (Vertex, Vertex) -> Tgraph -> QDiagram b V2 Double Any
forall a. (VPatch -> a) -> (Vertex, Vertex) -> Tgraph -> a
alignBefore (Measure Double
-> QDiagram b V2 Double Any -> QDiagram b V2 Double Any
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
thin (QDiagram b V2 Double Any -> QDiagram b V2 Double Any)
-> (VPatch -> QDiagram b V2 Double Any)
-> VPatch
-> QDiagram b V2 Double Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. QDiagram b V2 Double Any -> QDiagram b V2 Double Any
forall n b m.
(TypeableFloat n, Renderable (Path V2 n) b, Monoid' m) =>
QDiagram b V2 n m -> QDiagram b V2 n m
showOrigin (QDiagram b V2 Double Any -> QDiagram b V2 Double Any)
-> (VPatch -> QDiagram b V2 Double Any)
-> VPatch
-> QDiagram b V2 Double Any
forall b c a. (b -> c) -> (a -> b) -> a -> c
. VPatch -> QDiagram b V2 Double Any
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj) (Vertex, Vertex)
alm Tgraph
g

jackGraph,kingGraph,queenGraph,aceGraph,deuceGraph,starGraph::Tgraph
-- |Tgraph for vertex type jack.
jackGraph :: Tgraph
jackGraph = [TileFace] -> Tgraph
makeTgraph
  [(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
9,Vertex
11),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
11,Vertex
2),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
7,Vertex
8,Vertex
1),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
9,Vertex
1,Vertex
8),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
1,Vertex
3,Vertex
4)
  ,(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
1,Vertex
2,Vertex
3),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
7,Vertex
1,Vertex
5),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
4,Vertex
5,Vertex
1),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
9,Vertex
8,Vertex
10),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
4,Vertex
6,Vertex
5)
  ] -- centre 1
-- |Tgraph for vertex type king.
kingGraph :: Tgraph
kingGraph = [TileFace] -> Tgraph
makeTgraph
  [(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
2,Vertex
3),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
11,Vertex
2),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
4,Vertex
5),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
3,Vertex
4),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
10,Vertex
11)
  ,(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
9,Vertex
10),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
9,Vertex
1,Vertex
7),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
9,Vertex
7,Vertex
8),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
5,Vertex
7,Vertex
1),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
5,Vertex
6,Vertex
7)
  ] -- centre 1
-- |Tgraph for vertex type queen.
queenGraph :: Tgraph
queenGraph = [TileFace] -> Tgraph
makeTgraph
  [(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
7,Vertex
1,Vertex
5),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
3,Vertex
5,Vertex
1),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
2,Vertex
3),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
7,Vertex
9,Vertex
1),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
11,Vertex
1,Vertex
9)
  ,(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
11,Vertex
2),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
7,Vertex
5,Vertex
6),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
7,Vertex
8,Vertex
9),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
3,Vertex
4,Vertex
5),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
11,Vertex
9,Vertex
10)
  ] -- centre 1
-- |Tgraph for vertex type ace (same as fool).
aceGraph :: Tgraph
aceGraph = Tgraph
fool -- centre 3
-- |Tgraph for vertextype deuce.
deuceGraph :: Tgraph
deuceGraph = [TileFace] -> Tgraph
makeTgraph
  [(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
7,Vertex
8,Vertex
2),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
7,Vertex
2,Vertex
6),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RK (Vertex
5,Vertex
2,Vertex
4),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LK (Vertex
5,Vertex
6,Vertex
2),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
4,Vertex
2)
  ,(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
2,Vertex
8),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
3,Vertex
4),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
8,Vertex
9)
  ] -- centre 2
-- |Tgraph for vertex type star.
starGraph :: Tgraph
starGraph = [TileFace] -> Tgraph
makeTgraph
  [(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
2,Vertex
3),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
11,Vertex
2),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
10,Vertex
11),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
9,Vertex
10),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
8,Vertex
9)
  ,(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
7,Vertex
8),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
6,Vertex
7),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
5,Vertex
6),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
LD (Vertex
1,Vertex
4,Vertex
5),(Vertex, Vertex, Vertex) -> TileFace
forall rep. rep -> HalfTile rep
RD (Vertex
1,Vertex
3,Vertex
4)
  ] -- centre 1

-- |forceVFigures is a list of 7 diagrams - force of 7 vertex types.
--
-- When a specific Backend B is in scope, forceVFigures :: [Diagram B]
forceVFigures :: Renderable (Path V2 Double) b => [Diagram2D b]
forceVFigures :: forall {b}.
Renderable (Path V2 Double) b =>
[QDiagram b V2 Double Any]
forceVFigures = [Vertex] -> [Diagram2D b] -> [Diagram2D b]
forall a.
(Transformable a, V a ~ V2, N a ~ Double) =>
[Vertex] -> [a] -> [a]
rotations [Vertex
0,Vertex
0,Vertex
9,Vertex
5,Vertex
0,Vertex
0,Vertex
1] ([Diagram2D b] -> [Diagram2D b]) -> [Diagram2D b] -> [Diagram2D b]
forall a b. (a -> b) -> a -> b
$
                (Tgraph -> Diagram2D b) -> [Tgraph] -> [Diagram2D b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Diagram2D b -> Diagram2D b
forall (v :: * -> *) n a.
(InSpace v n a, Fractional n, Traversable v, Alignable a,
 HasOrigin a) =>
a -> a
center (Diagram2D b -> Diagram2D b)
-> (Tgraph -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
drawForce) [Tgraph
sunGraph,Tgraph
starGraph,Tgraph
jackGraph,Tgraph
queenGraph,Tgraph
kingGraph,Tgraph
aceGraph,Tgraph
deuceGraph]


sun3Dart :: Tgraph
-- |A sun with 3 darts on the boundary NOT all adjacent
-- (Used in superForceRocketsFig).
sun3Dart :: Tgraph
sun3Dart = (Vertex, Vertex) -> Tgraph -> Tgraph
forall a. Forcible a => (Vertex, Vertex) -> a -> a
addHalfDart (Vertex
9,Vertex
10) (Tgraph -> Tgraph) -> Tgraph -> Tgraph
forall a b. (a -> b) -> a -> b
$ (Vertex, Vertex) -> Tgraph -> Tgraph
forall a. Forcible a => (Vertex, Vertex) -> a -> a
addHalfDart (Vertex
8,Vertex
9) (Tgraph -> Tgraph) -> Tgraph -> Tgraph
forall a b. (a -> b) -> a -> b
$ (Vertex, Vertex) -> Tgraph -> Tgraph
forall a. Forcible a => (Vertex, Vertex) -> a -> a
addHalfDart (Vertex
5,Vertex
6) (Tgraph -> Tgraph) -> Tgraph -> Tgraph
forall a b. (a -> b) -> a -> b
$ (Vertex, Vertex) -> Tgraph -> Tgraph
forall a. Forcible a => (Vertex, Vertex) -> a -> a
addHalfDart (Vertex
4,Vertex
5) (Tgraph -> Tgraph) -> Tgraph -> Tgraph
forall a b. (a -> b) -> a -> b
$ (Vertex, Vertex) -> Tgraph -> Tgraph
forall a. Forcible a => (Vertex, Vertex) -> a -> a
addHalfDart (Vertex
3,Vertex
4) (Tgraph -> Tgraph) -> Tgraph -> Tgraph
forall a b. (a -> b) -> a -> b
$ (Vertex, Vertex) -> Tgraph -> Tgraph
forall a. Forcible a => (Vertex, Vertex) -> a -> a
addHalfDart (Vertex
2,Vertex
3) Tgraph
sunGraph
-- sun3Dart = addHalfDart (9,10) $ addHalfDart (8,9) sun2AdjDart


-- |Diagram showing superForce with initial Tgraph g (red), force g (red and black),
-- and superForce g (red and black and blue).
-- 
-- When a specific Backend B is in scope, superForceFig :: Diagram B
superForceFig :: Renderable (Path V2 Double) b => Diagram2D b
superForceFig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
superForceFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
thin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Angle Double -> Diagram2D b -> Diagram2D b
forall n t.
(InSpace V2 n t, Transformable t, Floating n) =>
Angle n -> t -> t
rotate (Vertex -> Angle Double
ttangle Vertex
1) (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
drawSuperForce Tgraph
g where
    g :: Tgraph
g = (Vertex, Vertex) -> Tgraph -> Tgraph
forall a. Forcible a => (Vertex, Vertex) -> a -> a
addHalfDart (Vertex
220,Vertex
221) (Tgraph -> Tgraph) -> Tgraph -> Tgraph
forall a b. (a -> b) -> a -> b
$ Tgraph -> Tgraph
forall a. Forcible a => a -> a
force (Tgraph -> Tgraph) -> Tgraph -> Tgraph
forall a b. (a -> b) -> a -> b
$ Tgraph -> [Tgraph]
decompositions Tgraph
fool [Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!!Vertex
3

-- |Diagram showing 4 rockets formed by applying superForce to successive decompositions
-- of sun3Dart. The decompositions are in red with normal force additions in black and superforce additions in blue.
-- 
-- When a specific Backend B is in scope, superForceRocketsFig :: Diagram B
superForceRocketsFig :: Renderable (Path V2 Double) b => Diagram2D b
superForceRocketsFig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
superForceRocketsFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
veryThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
vsep Double
1 ([Diagram2D b] -> Diagram2D b) -> [Diagram2D b] -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ [Vertex] -> [Diagram2D b] -> [Diagram2D b]
forall a.
(Transformable a, V a ~ V2, N a ~ Double) =>
[Vertex] -> [a] -> [a]
rotations [Vertex
8,Vertex
9,Vertex
9,Vertex
8] ([Diagram2D b] -> [Diagram2D b]) -> [Diagram2D b] -> [Diagram2D b]
forall a b. (a -> b) -> a -> b
$
   (Tgraph -> Diagram2D b) -> [Tgraph] -> [Diagram2D b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
drawSuperForce [Tgraph]
decomps where
      decomps :: [Tgraph]
decomps = Vertex -> [Tgraph] -> [Tgraph]
forall a. Vertex -> [a] -> [a]
take Vertex
4 ([Tgraph] -> [Tgraph]) -> [Tgraph] -> [Tgraph]
forall a b. (a -> b) -> a -> b
$ Tgraph -> [Tgraph]
decompositions Tgraph
sun3Dart


boundaryFDart4, boundaryFDart5 :: Tgraph
-- |graph of the boundary faces only of a forced graph (dartDs!!4)
boundaryFDart4 :: Tgraph
boundaryFDart4 = [TileFace] -> Tgraph
checkedTgraph ([TileFace] -> Tgraph) -> [TileFace] -> Tgraph
forall a b. (a -> b) -> a -> b
$ BoundaryState -> [TileFace]
boundaryFaces (BoundaryState -> [TileFace]) -> BoundaryState -> [TileFace]
forall a b. (a -> b) -> a -> b
$ BoundaryState -> BoundaryState
forall a. Forcible a => a -> a
force (BoundaryState -> BoundaryState) -> BoundaryState -> BoundaryState
forall a b. (a -> b) -> a -> b
$ Tgraph -> BoundaryState
makeBoundaryState Tgraph
dartD4
-- |graph of the boundary faces only of a forced graph (dartDs!!5)
boundaryFDart5 :: Tgraph
boundaryFDart5 = [TileFace] -> Tgraph
checkedTgraph ([TileFace] -> Tgraph) -> [TileFace] -> Tgraph
forall a b. (a -> b) -> a -> b
$ BoundaryState -> [TileFace]
boundaryFaces (BoundaryState -> [TileFace]) -> BoundaryState -> [TileFace]
forall a b. (a -> b) -> a -> b
$ BoundaryState -> BoundaryState
forall a. Forcible a => a -> a
force (BoundaryState -> BoundaryState) -> BoundaryState -> BoundaryState
forall a b. (a -> b) -> a -> b
$ Tgraph -> BoundaryState
makeBoundaryState ([Tgraph]
dartDs[Tgraph] -> Vertex -> Tgraph
forall a. HasCallStack => [a] -> Vertex -> a
!!Vertex
5)

boundaryFDart4Fig,boundaryFDart5Fig :: (Renderable (Path V2 Double) b, Renderable (Text Double) b) => Diagram2D b
-- |figure of the boundary faces only of a forced graph (dartDs!!4).
-- 
-- When a specific Backend B is in scope, boundaryFDart4Fig :: Diagram B
boundaryFDart4Fig :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
boundaryFDart4Fig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
ultraThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> (Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
Measure Double -> (Patch -> Diagram2D b) -> a -> Diagram2D b
labelSize Measure Double
forall n. OrderedField n => Measure n
tiny Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj Tgraph
boundaryFDart4
-- |figure of the boundary faces only of a forced graph (dartDs!!5).
-- 
-- When a specific Backend B is in scope, boundaryFDart5Fig :: Diagram B
boundaryFDart5Fig :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
boundaryFDart5Fig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
ultraThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> (Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
Measure Double -> (Patch -> Diagram2D b) -> a -> Diagram2D b
labelSize (Double -> Measure Double
forall n. Num n => n -> Measure n
normalized Double
0.006) Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj Tgraph
boundaryFDart5

boundaryGapFDart4, boundaryGapFDart5 :: Tgraph
-- |graph of the boundary faces only of a forced graph - with extra faces removed to make a gap
boundaryGapFDart4 :: Tgraph
boundaryGapFDart4 = [Vertex] -> Tgraph -> Tgraph
removeVertices [Vertex
354] Tgraph
boundaryFDart4
    -- checkedTgraph $ filter ((/=354).originV)  (faces boundaryFDart4)
-- |graph of the boundary faces only of a forced graph - with extra faces removed to make a gap
boundaryGapFDart5 :: Tgraph
boundaryGapFDart5 = [Vertex] -> Tgraph -> Tgraph
removeVertices [Vertex
1467] Tgraph
boundaryFDart5
    -- checkedTgraph $ filter ((/=1467).originV) (faces boundaryFDart5)

boundaryGap4Fig, boundaryGap5Fig  :: (Renderable (Path V2 Double) b, Renderable (Text Double) b) => Diagram2D b
-- |figure for the boundary gap graph boundaryGapFDart4.
-- 
-- When a specific Backend B is in scope, boundaryGap4Fig :: Diagram B
boundaryGap4Fig :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
boundaryGap4Fig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
ultraThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> (Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
Measure Double -> (Patch -> Diagram2D b) -> a -> Diagram2D b
labelSize Measure Double
forall n. OrderedField n => Measure n
tiny Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj Tgraph
boundaryGapFDart4
-- |figure for the boundary gap graph boundaryGapFDart5.
-- 
-- When a specific Backend B is in scope, boundaryGap5Fig :: Diagram B
boundaryGap5Fig :: forall b.
(Renderable (Path V2 Double) b, Renderable (Text Double) b) =>
Diagram2D b
boundaryGap5Fig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
ultraThin (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Measure Double -> (Patch -> Diagram2D b) -> Tgraph -> Diagram2D b
forall b a.
(Renderable (Path V2 Double) b, Renderable (Text Double) b,
 DrawableLabelled a) =>
Measure Double -> (Patch -> Diagram2D b) -> a -> Diagram2D b
labelSize (Double -> Measure Double
forall n. Num n => n -> Measure n
normalized Double
0.006) Patch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
drawj Tgraph
boundaryGapFDart5


-- | boundaryVCoveringFigs bd - produces a list of diagrams for the boundaryVCovering of bd 
-- (with the Tgraph represented by bd shown in red in each case).
-- 
-- When a specific Backend B is in scope, boundaryVCoveringFigs :: BoundaryState -> [Diagram B]
boundaryVCoveringFigs :: Renderable (Path V2 Double) b =>
                         BoundaryState -> [Diagram2D b]
boundaryVCoveringFigs :: forall b.
Renderable (Path V2 Double) b =>
BoundaryState -> [Diagram2D b]
boundaryVCoveringFigs BoundaryState
bd =
    (BoundaryState -> Diagram2D b) -> [BoundaryState] -> [Diagram2D b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
ultraThin (Diagram2D b -> Diagram2D b)
-> (BoundaryState -> Diagram2D b) -> BoundaryState -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Diagram2D b
redg Diagram2D b -> Diagram2D b -> Diagram2D b
forall a. Semigroup a => a -> a -> a
<>) (Diagram2D b -> Diagram2D b)
-> (BoundaryState -> Diagram2D b) -> BoundaryState -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (VPatch -> Diagram2D b)
-> (Vertex, Vertex) -> Tgraph -> Diagram2D b
forall a. (VPatch -> a) -> (Vertex, Vertex) -> Tgraph -> a
alignBefore VPatch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
draw (Vertex, Vertex)
alig (Tgraph -> Diagram2D b)
-> (BoundaryState -> Tgraph) -> BoundaryState -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BoundaryState -> Tgraph
recoverGraph) ([BoundaryState] -> [Diagram2D b])
-> [BoundaryState] -> [Diagram2D b]
forall a b. (a -> b) -> a -> b
$ BoundaryState -> [BoundaryState]
boundaryVCovering BoundaryState
bd
      where redg :: Diagram2D b
redg = Colour Double -> Diagram2D b -> Diagram2D b
forall n a.
(InSpace V2 n a, Typeable n, Floating n, HasStyle a) =>
Colour Double -> a -> a
lc Colour Double
forall a. (Ord a, Floating a) => Colour a
red (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Tgraph -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
draw Tgraph
g --alignBefore draw alig g
            alig :: (Vertex, Vertex)
alig = Tgraph -> (Vertex, Vertex)
defaultAlignment Tgraph
g
            g :: Tgraph
g = BoundaryState -> Tgraph
recoverGraph BoundaryState
bd

-- | boundaryECoveringFigs bd - produces a list of diagrams for the boundaryECovering of bd  
-- (with the Tgraph represented by bd shown in red in each case).
-- 
-- When a specific Backend B is in scope, boundaryECoveringFigs :: BoundaryState -> [Diagram B]
boundaryECoveringFigs :: Renderable (Path V2 Double) b =>
                         BoundaryState -> [Diagram2D b]
boundaryECoveringFigs :: forall b.
Renderable (Path V2 Double) b =>
BoundaryState -> [Diagram2D b]
boundaryECoveringFigs BoundaryState
bd =
    (BoundaryState -> Diagram2D b) -> [BoundaryState] -> [Diagram2D b]
forall a b. (a -> b) -> [a] -> [b]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (Measure Double -> Diagram2D b -> Diagram2D b
forall a n.
(N a ~ n, HasStyle a, Typeable n) =>
Measure n -> a -> a
lw Measure Double
forall n. OrderedField n => Measure n
ultraThin (Diagram2D b -> Diagram2D b)
-> (BoundaryState -> Diagram2D b) -> BoundaryState -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Diagram2D b
redg Diagram2D b -> Diagram2D b -> Diagram2D b
forall a. Semigroup a => a -> a -> a
<>) (Diagram2D b -> Diagram2D b)
-> (BoundaryState -> Diagram2D b) -> BoundaryState -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (VPatch -> Diagram2D b)
-> (Vertex, Vertex) -> Tgraph -> Diagram2D b
forall a. (VPatch -> a) -> (Vertex, Vertex) -> Tgraph -> a
alignBefore VPatch -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
draw (Vertex, Vertex)
alig (Tgraph -> Diagram2D b)
-> (BoundaryState -> Tgraph) -> BoundaryState -> Diagram2D b
forall b c a. (b -> c) -> (a -> b) -> a -> c
. BoundaryState -> Tgraph
recoverGraph) ([BoundaryState] -> [Diagram2D b])
-> [BoundaryState] -> [Diagram2D b]
forall a b. (a -> b) -> a -> b
$ BoundaryState -> [BoundaryState]
boundaryECovering BoundaryState
bd
      where redg :: Diagram2D b
redg = Colour Double -> Diagram2D b -> Diagram2D b
forall n a.
(InSpace V2 n a, Typeable n, Floating n, HasStyle a) =>
Colour Double -> a -> a
lc Colour Double
forall a. (Ord a, Floating a) => Colour a
red (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Tgraph -> Diagram2D b
forall a b.
(Drawable a, Renderable (Path V2 Double) b) =>
a -> Diagram2D b
draw Tgraph
g
            alig :: (Vertex, Vertex)
alig = Tgraph -> (Vertex, Vertex)
defaultAlignment Tgraph
g
            g :: Tgraph
g = BoundaryState -> Tgraph
recoverGraph BoundaryState
bd

kingECoveringFig,kingVCoveringFig :: Renderable (Path V2 Double) b => Diagram2D b
-- | diagram showing the boundaryECovering of a forced kingGraph.
-- 
-- When a specific Backend B is in scope, kingECoveringFig :: Diagram B
kingECoveringFig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
kingECoveringFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Vertex -> [Diagram2D b] -> Diagram2D b
forall b. Vertex -> [Diagram2D b] -> Diagram2D b
arrangeRows Vertex
3 ([Diagram2D b] -> Diagram2D b) -> [Diagram2D b] -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ BoundaryState -> [Diagram2D b]
forall b.
Renderable (Path V2 Double) b =>
BoundaryState -> [Diagram2D b]
boundaryECoveringFigs (BoundaryState -> [Diagram2D b]) -> BoundaryState -> [Diagram2D b]
forall a b. (a -> b) -> a -> b
$ BoundaryState -> BoundaryState
forall a. Forcible a => a -> a
force (BoundaryState -> BoundaryState) -> BoundaryState -> BoundaryState
forall a b. (a -> b) -> a -> b
$ Tgraph -> BoundaryState
makeBoundaryState Tgraph
kingGraph
-- | diagram showing the boundaryVCovering of a forced kingGraph.
-- 
-- When a specific Backend B is in scope, kingVCoveringFig :: Diagram B
kingVCoveringFig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
kingVCoveringFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Vertex -> [Diagram2D b] -> Diagram2D b
forall b. Vertex -> [Diagram2D b] -> Diagram2D b
arrangeRows Vertex
3 ([Diagram2D b] -> Diagram2D b) -> [Diagram2D b] -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ BoundaryState -> [Diagram2D b]
forall b.
Renderable (Path V2 Double) b =>
BoundaryState -> [Diagram2D b]
boundaryVCoveringFigs (BoundaryState -> [Diagram2D b]) -> BoundaryState -> [Diagram2D b]
forall a b. (a -> b) -> a -> b
$ BoundaryState -> BoundaryState
forall a. Forcible a => a -> a
force  (BoundaryState -> BoundaryState) -> BoundaryState -> BoundaryState
forall a b. (a -> b) -> a -> b
$ Tgraph -> BoundaryState
makeBoundaryState Tgraph
kingGraph

kingEmpiresFig, kingEmpire1Fig, kingEmpire2Fig :: Renderable (Path V2 Double) b => Diagram2D b
-- | figure showing King's empires (1 and 2).
-- 
-- When a specific Backend B is in scope, kingEmpiresFig :: Diagram B
kingEmpiresFig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
kingEmpiresFig = Diagram2D b -> Diagram2D b
forall b. Diagram2D b -> Diagram2D b
padBorder (Diagram2D b -> Diagram2D b) -> Diagram2D b -> Diagram2D b
forall a b. (a -> b) -> a -> b
$ Double -> [Diagram2D b] -> Diagram2D b
forall n a.
(InSpace V2 n a, Floating n, Juxtaposable a, HasOrigin a,
 Monoid' a) =>
n -> [a] -> a
hsep Double
10 [Diagram2D b
forall b. Renderable (Path V2 Double) b => Diagram2D b
kingEmpire1Fig, Diagram2D b
forall b. Renderable (Path V2 Double) b => Diagram2D b
kingEmpire2Fig]
-- | figure showing King's empires 1.
-- 
-- When a specific Backend B is in scope, kingEmpire1Fig :: Diagram B
kingEmpire1Fig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
kingEmpire1Fig = Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
showEmpire1 Tgraph
kingGraph
-- | figure showing King's empire 2.
-- 
-- When a specific Backend B is in scope, kingEmpire2Fig :: Diagram B
kingEmpire2Fig :: forall b. Renderable (Path V2 Double) b => Diagram2D b
kingEmpire2Fig = Tgraph -> Diagram2D b
forall b. Renderable (Path V2 Double) b => Tgraph -> Diagram2D b
showEmpire2 Tgraph
kingGraph