module Fun_geom (grid, nil, rot, beside, above, squarelimit)
where
import Vector
import Fish_lines
type Line_segment = (Nr, Nr, Nr, Nr)
type Picture = Vec -> Vec -> Vec -> [Line_segment]
nil a b c = []
grid :: Nr -> Nr -> [Line_segment] -> Vec -> Vec -> Vec
-> [Line_segment]
grid m n segments a b c
= [tup2
(a `vec_add` (scale_vec2 b x0 m) `vec_add` (scale_vec2 c y0 n))
(a `vec_add` (scale_vec2 b x1 m) `vec_add` (scale_vec2 c y1 n))
| (x0, y0, x1, y1) <- segments]
rot p a b c = p (a `vec_add` b) c ((0, 0) `vec_sub` b)
beside m n p q a b c
= p a (scale_vec2 b m (m+n)) c ++
q (a `vec_add` (scale_vec2 b m (m+n))) (scale_vec2 b n (n+m)) c
above m n p q a b c
= p (a `vec_add` (scale_vec2 c n (m+n))) b (scale_vec2 c m (n+m)) ++
q a b (scale_vec2 c n (m+n))
tup2 :: (a, b) -> (c, d) -> (a, b, c, d)
tup2 (a, b) (c, d) = (a, b, c, d)
tile_to_grid = grid 16 16
p = tile_to_grid p_tile
q = tile_to_grid q_tile
r = tile_to_grid r_tile
s = tile_to_grid s_tile
quartet a b c d = above 1 1 (beside 1 1 a b) (beside 1 1 c d)
t = quartet p q r s
cycle' p1 = quartet p1 (rot (rot (rot p1))) (rot p1) (rot (rot p1))
u = cycle' (rot q)
side1 = quartet nil nil (rot t) t
side2 = quartet side1 side1 (rot t) t
corner1 = quartet nil nil nil u
corner2 = quartet corner1 side1 (rot side1) u
pseudocorner = quartet corner2 side2 (rot side2) (rot t)
pseudolimit = cycle' pseudocorner
nonet p1 p2 p3 p4 p5 p6 p7 p8 p9
= above 1 2 (beside 1 2 p1 (beside 1 1 p2 p3))
(above 1 1 (beside 1 2 p4 (beside 1 1 p5 p6))
(beside 1 2 p7 (beside 1 1 p8 p9)))
corner = nonet corner2 side2 side2 (rot side2) u (rot t) (rot side2) (rot t)
(rot q)
squarelimit = cycle' corner
|