fish :: Painter
fish = segmentsToPainter 80 80
    [[(40,60),(33,63),(27,65),(20,64),(17,67),(12,72),(5,77),(0,80),(-2,72),
      (-4,60),(-4,50),(-4,44),(-12,38),(-16,30),(-20,20),(0,0),(20,20),(30,16),
      (38,12),(44,4),(50,4),(60,4),(72,2),(80,0),(75,3),(68,8),(63,13),(60,16),
      (53,15),(46,17),(40,20),(32,32),(40,40)],[(0,64),(0,54),(4,58),(0,64)],
     [(8,68),(8,58),(12,60),(8,68)],[(8,54),(16,42),(28,26),(40,16),(58,10)],
     [(-4,44),(6,28),(20,20)],[(-2,36),(-8,30),(-12,22)],
     [(2,30),(-6,22),(-8,16)],[(8,24),(-2,16),(-4,10)],[(10,18),(2,10),(0,6)],
     [(20,64),(24,56),(26,44),(32,32)],[(26,56),(30,58),(34,58),(40,54)],
     [(28,50),(32,52),(36,52),(40,50)],[(30,42),(34,46),(40,46)],
     [(38,36),(40,34)],[(38,32),(40,30)],[(36,30),(40,26)]]

rot45 :: Painter -> Painter                 -- 左上を中心に45度の回転
rot45 p = transformPainter p (0.5,0.5) (1,1) (0,1)
over :: Painter -> Painter -> Painter       -- 2枚のぺインタを重ねる
over p q = \ frame -> do transformPainter p (0,0) (1,0) (0,1) frame
                         transformPainter q (0,0) (1,0) (0,1) frame

fish2,u,t :: Painter
fish2 = flipHoriz (rot45 fish)
u = over (over fish2 (rot fish2))           -- 図-5のL
         (over (rot(rot fish2)) (rot(rot(rot fish2))))
t = over fish (over fish2 (rot(rot(rot fish2))))    -- 図-5のK

nonet :: Painter -> Painter -> Painter -> Painter -> Painter -> 
         Painter -> Painter -> Painter -> Painter -> Painter        --p q r
nonet p q r s t u v w x =                                           --s t u
  above 1 2 (beside 1 2 p (q <-> r))                                --v w x
            ((beside 1 2 s (t <-> u)) </> (beside 1 2 v (w <-> x)))

square, corner, side :: Int -> Painter
square n =
  nonet (corner n) (side n) (rot(rot(rot(corner n))))
        (rot(side n)) u (rot(rot(rot(side n))))
        (rot(corner n)) (rot(rot(side n))) (rot(rot(corner n)))

quartet :: Painter -> Painter -> Painter -> Painter -> Painter
quartet p q r s = (p <-> q) </> (r <-> s)

corner 0 = blank
corner (n+1) = quartet (corner n) (side n) (rot(side n)) u

side 0 = blank
side (n+1) = quartet (side n) (side n) (rot t) t

main = square 2 unitSquare

