Image 倒置阿诺德';s Cat映射-负数组索引

Image 倒置阿诺德';s Cat映射-负数组索引,image,encryption,shuffle,pixels,Image,Encryption,Shuffle,Pixels,我尝试使用以下公式实现N*N个图像 for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { desMatrix[(i + j) % N][(i + 2 * j) % N] = srcMatrix[i][j]; } } for(inti=0;i

我尝试使用以下公式实现N*N个图像

            for (int i = 0; i < N; i++) {  
                for (int j = 0; j < N; j++) {  
                  desMatrix[(i + j) % N][(i + 2 * j) % N] = srcMatrix[i][j];  
                }  
            }
for(inti=0;i
要反转此过程,我需要执行以下操作:

            for (int i = 0; i < N; i++) {  
                for (int j = 0; j < N; j++) {  
                  srcMatrix[(j-i) % N][(2*i-j) % N] = destMatrix[i][j];  
                }  
            }
for(inti=0;i
实现是否正确

在我看来,对于j和i的某些值,我可能从(j-i)和(2*i-j)得到负指数;由于矩阵索引仅为正,我应该如何处理这些情况?

一般来说,当模(%)运算需要处理负索引时,只需根据需要多次添加模参数即可。自

x % N  == ( x + a*N ) % N
对于所有的自然a,在这种情况下,i和j被约束在[0,N]中,那么你可以写(N+i-j),并确保即使i是0,j是N-1(或者甚至是N),结果也总是非负的。同样地,(2*N+i-2*j)或者等价地(i+2*(N-j))总是非负的

不过,在这种情况下,这是不必要的。要反转贴图,您需要重复向前的步骤,反转赋值。由于矩阵具有一元行列式且保持面积,您可以确信最终将获得所有点(即覆盖M(i+1)将产生覆盖M(i))

for(int i=0;i
此时,newMatrix和srcMatrix应该是相同的


(实际上,您已经将反向转换作为正向转换运行。我设置的反向转换是正向转换的常用形式)

Meta:当你写答案时,请仔细检查问题,看看是否可以改进格式、标签、标题、语法等。这将提高问题的可读性和搜索性,并可能让你获得更多的选票。此外,还有一些标签需要获得。感谢大家的提醒;我实际上也忘记了解决问题的一部分这个问题可能比一个模糊的映射更有趣。稍后我将尝试检查是否有其他关于负索引主题的SO答案,并添加必要的参考。
for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++) {
        newMatrix[i][j] = desMatrix[(i + j) % N][(i + 2 * j) % N];
    }
}