-1 haskell rotation matrix ppm
我需要有关haskell中的旋转或旋转矩阵的帮助
我有一个数据类型为RGB的列表:
data RGBdata= RGB Int Int Int
m = [[(RGB 0 255 255),(RGB 255 0 0)],[(RGB 255 255 255),(RGB 255 0 0)]]
Run Code Online (Sandbox Code Playgroud)
更好看我有一个2x2矩阵:
m = [[(RGB 1 2 3),(RGB 4 5 6)],
[(RGB 7 8 9),(RGB 1 5 9)]]
Run Code Online (Sandbox Code Playgroud)
我需要90°旋转,我的意思是:
m = [[(RGB 7 8 9),(RGB 1 2 3)]
[(RGB 1 5 9),(RGB 4 5 6)]]
Run Code Online (Sandbox Code Playgroud)
扩展我的解释,我有2种数据类型:
data RGBdata= RGB Int Int Int
data PBMfile= PBM Int Int [[RGBdata]]
Run Code Online (Sandbox Code Playgroud)
我的功能收到:
spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y ((transpose . reverse) l))
Run Code Online (Sandbox Code Playgroud)
其中'x'和'y'分别是colums和rows的数量(也许可以帮助完成这个功能).
我尝试用你的anwer向左旋转90°,图像结果是错误的.
我试试
spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y ((reverse . transpose) l))
Run Code Online (Sandbox Code Playgroud)
和
spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y ((transpose . reverse) l))
Run Code Online (Sandbox Code Playgroud)
和
spin :: PBMfile -> PBMfile
spin (PBM x y l) = (PBM x y (((map reverse) . transpose) l))
Run Code Online (Sandbox Code Playgroud)
旋转图像但不起作用.
结果是这样的
如果您计划使用列表来存储大图像,请记住它可能效率低,因为每个像素有五个盒装值(很多字节).使用未装箱的Vector或Array会更有效.只是给你一个抬头.
也就是说,让我们根据它们对图像的作用来查看列表操作.
> let demo f = mapM_ print $ f m
> demo id
[RGB 1 2 3,RGB 4 5 6]
[RGB 7 8 9,RGB 1 5 9]
> demo reverse
[RGB 7 8 9,RGB 1 5 9]
[RGB 1 2 3,RGB 4 5 6]
> demo (map reverse)
[RGB 4 5 6,RGB 1 2 3]
[RGB 1 5 9,RGB 7 8 9]
> demo (transpose)
[RGB 1 2 3,RGB 7 8 9]
[RGB 4 5 6,RGB 1 5 9]
Run Code Online (Sandbox Code Playgroud)
reverse 垂直翻转图像(通过反转行)
map reverse 水平翻转图像(通过反转每行中的像素)
transpose沿\对角线翻转图像.
现在,找到一张纸,并找出如何根据这些操作执行所需的旋转(transpose如果您的纸张是矩形,建模是棘手的).请记住,只要看到纸张背面,图像就会显示为镜像.由于这些操作中的每一个都会转动纸张,因此您需要偶数个来执行旋转.
你可以做的唯一的旋转reverse和map reverse是把纸翻转过来.这意味着您需要transpose将图像旋转90°.
transpose(对角翻转)后跟reverse(垂直翻转)将图像向左旋转90° :
> demo (reverse . transpose)
[RGB 4 5 6,RGB 1 5 9]
[RGB 1 2 3,RGB 7 8 9]
Run Code Online (Sandbox Code Playgroud)
另一方面,reverse(垂直翻转)后跟transpose(对角翻转)将图像向右旋转90° (您想要的):
> demo (transpose . reverse)
[RGB 7 8 9,RGB 1 2 3]
[RGB 1 5 9,RGB 4 5 6]
Run Code Online (Sandbox Code Playgroud)