给定相同宽度和高度的彩色光栅图像,输出在阿诺德猫图下转换的图像。(*详情见下文)
考虑到图像N
的大小,我们假设像素的坐标是以0
和N-1
之间的数字表示的。
然后,阿诺德的猫地图定义如下:
坐标[x,y]
处的像素被移动到[(2*x + y) mod N, (x + y) mod N]
。
这只不过是环面上的线性变换:由于mod N
,黄色、紫色和绿色部分被映射回初始正方形。
这个映射(让我们称之为f
)具有以下属性:
[[2,1],[1,1]]
的线性变换。由于它有行列式1
,并且只有整数项,逆也只有整数项,由[[1,-1],[-1,2]]
给出,这意味着它在整数坐标上也是双射的。N x N
图像的一组双射映射的扭转元素,这意味着如果您多次应用它,您将得到原始图像:f(f(...f(x)...)) = x
--应用到它自身的映射的次数,其结果是标识的数量保证小于或等于3*N
。在以下中,您可以看到在阿诺德的猫映射的给定次数的迭代应用程序之后,猫的图像,以及重复应用程序的样子的动画:(0,0)
点位于左下角还是左上角并不重要。(或者在任何其他角落,如果这在您的语言中更方便的话)。请具体说明您在提交时使用的约定。矩阵形式([1,2,3,4]
是顶行,1
有索引(0,0)
,2
有索引(1,0)
,5
有索引(0,1)
)
1 2 3 4
5 6 7 8
9 10 11 12
13 14 15 16
maps to:
1 14 11 8
12 5 2 15
3 16 9 6
10 7 4 13
--------------------
1 2 3
4 5 6
7 8 9
map to:
1 8 6
9 4 2
5 3 7
作为图像(左下角是(0,0)
):
发布于 2017-01-02 19:47:53
(n=MapIndexed[RotateLeft[#,1-#2]&,#]&)@*n
林恩奇异算法港。在上一次U+F3C7编码之前,有一个不可见的3字节字符,即UTF-8编码中的]
;Mathematica将其呈现为上标T
,并接受矩阵的转置。
Table[#2[[Mod[2x-y-1,#]+1,Mod[y-x,#]+1]],{x,#},{y,#}]&
未命名函数采用两个参数,一个正整数#
和一个维#
x#
的2D数组#2
,并返回一个形状相似的2D数组。与给定的测试用例一样,坐标{0,0}的点位于左上角,x轴是水平的。使用问题中提到的逆[[1,-1],[-1,2]]
直接实现,在第一个坐标中有一个-1
来解释数组本身就是1-索引的事实。如果不允许我们把矩阵的维数作为附加参数,那么这个解就长了9个字节(用a
S代替第一个#
-not#2
-with a=Length@#
和所有后来的#
s )。
发布于 2017-01-02 20:16:34
m#n|r<-[0..n-1]=[[m!!mod(2*y-x)n!!mod(x-y)n|x<-r]|y<-r]
用法示例:[[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]] # 4
-> [[1,14,11,8],[12,5,2,15],[3,16,9,6],[10,7,4,13]]
。
0,0
是左上角。这使用了逆变换。
发布于 2017-01-02 20:41:56
v=getPixel((x+y)%w,(2*y+x)%h)
https://codegolf.stackexchange.com/questions/105362
复制相似问题