Как повернуть содержимое файла Haskell
Нужно повернуть содержимое текстового файла на n градусов(содержимое может быть представлено любыми символами) Сделал поворот матрицы на 90 влево и вправо
import Data.List
rotateLeft :: [[a]] -> [[a]]
rotateLeft = reverse . transpose
rotateRight :: [[a]] -> [[a]]
rotateRight = transpose . reverse
Но вот с углами не кратными 90 вообще придумать ничего не могу.Да и эта матрица только числа принимает Со считыванием матрицы из файла немного накидал,но тоже не то
import System.IO
import System.Environment
main = do
[fileName] <- getArgs
fileSource <- readFile fileName
let fileMatrix = map (\x -> map (\i -> (read i) :: Int) $ words x) $ lines
Он выдает ошибку
Помогите,добрые люди студенту.У нас по ФП вообще 0 методичек,делаем все задания на ощупь.Вожусь с этой задачей уже 2 неделю.Заранее спасибо
Ответы (1 шт):
Автор решения: extrn
→ Ссылка
Легкого способа не ищите, принцип такой же, как у поворота растрового изображения
image :: [[Char]]
image =
[ "TTTTTTTT EEEEEEEE SSSSSS SSSSSSSS"
, " TT EE SS SS SS "
, " TT EE SS SS "
, " TT EEEEEE SSSSSS SS "
, " TT EE SS SS "
, " TT EE SS SS SS "
, " TT EEEEEEEE SSSSSS SS "
]
getPixel :: [[Char]] -> Int -> Int -> Char
getPixel img x y
| x >= 0 && x < width && y >= 0 && y < height = img !! y !! x
| otherwise = ' '
where
height = length img
width = length $ head img
rotate :: Double -> (Double, Double) -> (Double, Double)
rotate a (x, y) = (x * cos a + y * sin a, -x * sin a + y * cos a)
main :: IO ()
main = mapM_ putStrLn $ do
y <- [0 .. 30]
return $ do
x <- [0 .. 40]
let (x', y') = rotate (pi / 4) (x - 5, y - 2)
return $ getPixel image (floor x') (floor y')
T
TT
TT
TT
TTTT
TTT TT
TTT T
TTT EE
T EEEE
EEE EE
EEE EE
EEE E EE
E E EE
E E
E SSS
E SSSSS
E SS SS
S S SS
SS S SS
S S S
S SS SS
SSSS SS
SS SS
SSSS
SSS SS
SSS S
SSS
S
