Défi
Étant donné une image raster couleur * avec la même largeur et la même hauteur, sortez l'image transformée sous la carte de chat d'Arnold . (* détails voir ci-dessous)
Définition
Étant donné la taille de l'image, N
nous supposons que les coordonnées d'un pixel sont données sous forme de nombres entre 0
et N-1
.
La carte du chat d'Arnold est alors définie comme suit:
Un pixel aux coordonnées [x,y]
est déplacé vers [(2*x + y) mod N, (x + y) mod N]
.
Ce n'est rien d'autre qu'une transformation linéaire sur le tore: les parties jaune, violette et verte sont remappées sur le carré initial en raison de la mod N
.
Cette carte (appelons-la f
) a les propriétés suivantes:
C'est bijectif , c'est-à-dire réversible: c'est une transformation linéaire avec la matrice
[[2,1],[1,1]]
. Comme il a un déterminant1
et qu'il n'a que des entrées entières, l'inverse n'a également que des entrées entières et est donné par[[1,-1],[-1,2]]
, cela signifie qu'il est également bijectif sur les coordonnées entières.Il s'agit d'un élément de torsion du groupe de cartes d'
N x N
images bijectives , ce qui signifie que si vous l'appliquez suffisamment de fois, vous récupérerez l'image d'origine:f(f(...f(x)...)) = x
le nombre de fois où la carte appliquée à elle-même se traduit par l'identité est garanti inférieur ou égal à3*N
. Dans ce qui suit, vous pouvez voir l'image d'un chat après un nombre donné d'applications itérées de la carte de chat d' Arnold , et une animation de ce à quoi ressemble une application répétée:
Détails
Votre programme ne doit pas nécessairement traiter d'images, mais les matrices / matrices 2D, les chaînes ou les structures 2D similaires sont également acceptables.
Peu importe que votre
(0,0)
point soit en bas à gauche ou en haut à gauche. (Ou dans tout autre coin, si cela est plus pratique dans votre langue.) Veuillez spécifier la convention que vous utilisez dans votre soumission.
Cas de test
Sous forme matricielle ( [1,2,3,4]
est la ligne supérieure, 1
a un index (0,0)
, 2
a un index (1,0)
, 5
a un index (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
Comme image (en bas à gauche (0,0)
):