-- LML original: Sandra Foubister, 1990
-- Haskell translation: Colin Runciman, May 1991
module Geomfuns(
mapx, mapy, col, row, lrinvert, antirotate, place, rotatecw,
tbinvert, tile, t4, xymax) where
import Mgrfuns
import Drawfuns
--CR strange instructions here!
-- xymax should be in layout.m, and the functions like t4 in
-- a module specific to the program that #includes "layout.t"
swapxy :: [Int] -> [Int]
--xs [x1,y1,x2,y2] = [x1,x2]
--ys [x1,y1,x2,y2] = [y1,y2]
swapxy [x1,y1,x2,y2] = [y1,x1,y2,x2]
mapx, mapy :: (Int -> Int) -> [Int] -> [Int]
mapx f [x1,y1,x2,y2] = [f x1, y1, f x2, y2]
mapy f [x1,y1,x2,y2] = [x1, f y1, x2, f y2]
toright, down :: Int -> [[Int]] -> [[Int]]
toright = map . mapx . (+)
down = map . mapy . (+)
origin :: Int -> Int -> [[Int]] -> [[Int]]
origin x y = (toright x) . (down y)
-- place x y takes a print and outputs a string that
-- is interpreted by MGR with the result that
-- the print is drawn at x y
place :: Int -> Int -> [[Int]] -> [Char]
place x y = drawlines . (origin x y)
-- 72 is the size of the square in the big tile
xymax :: Int
xymax = 72
-- lrinvert etc still need the size of the square in which to do it
-- so have not yet reverted to their original generality
lrinvert, tbinvert, rotatecw, antirotate :: Int -> [[Int]] -> [[Int]]
lrinvert m = map (mapx (\x -> m-x))
tbinvert m = map (mapy (\x -> m-x))
rotatecw m = map (swapxy . (mapy (\x -> m-x)))
antirotate m = map (swapxy . (mapx (\x -> m-x)))
--CR this doesn't really belong here - redefinition (cf postscript)!
-- a function specifically for the potatoprinting program
-- ss is the square size
t4 :: [[[Int]]] -> [[Int]]
t4 [c1,c2,c3,c4] = c1 ++
toright ss c2 ++
down ss c3 ++
(down ss . toright ss) c4
where
ss = xymax
-- a tile function specifically for use with t4
--CR ditto
tile :: Int -> Int -> Int -> Int -> [[Int]] -> [Char]
tile _ _ _ 0 coords = ""
tile _ _ 0 _ coords = ""
tile x y c r coords = col x y r coords ++
row (x + 2*xymax) y (c-1) coords ++
tile (x + 2*xymax) (y + 2*xymax) (c-1)(r-1) coords
col, row :: Int -> Int -> Int -> [[Int]] -> [Char]
col x y 0 coords = ""
col x y n coords = place x y coords ++ col x y' (n-1) coords
where
y' = y + (2 * xymax)
row x y 0 coords = ""
row x y n coords = place x y coords ++ row x' y (n-1) coords
where
x' = x + (2 * xymax)
|