下面的代码演示了将浮点数组旋转 90 度的倍数。后来我将浮点数组转换为字节数组,这样我就可以生成测试图像来验证结果;我没有包含那部分代码,因为它只会混淆要点,并不是你真正要问的。如果你需要那部分,让我知道我会发布它。
请注意,我是“就地”而不是“就地”进行轮换的。我相信后者是你真正感兴趣的,但即便如此,下面的方法对你来说应该是一个好的开始。可以在此处找到有关就地转换的其他讨论,其中围绕使用转置类型操作(内存交换),但我没有时间整理所有这些细节,我把那部分留给你.
回想一下,对于 n*90 度的逆时针旋转,变换由下式给出:
那么当然:
但在实际代码中,您需要分别通过 imageHeight/2 和 imageWidth/2 转换 row' 和 col',如下面的代码所示,以避免将负索引传递给数组。
将 row_p 和 col_p 表示为 row' 和 col',代码如下所示:
// Note: nX = pixels wide, nY = pixels tall
float *dataVector = // some data source, arbitrary
// Setup the array for the out-of-place transformation:
float *dataVector2 = new float[nX*nY];
int n = -2; // Example: set n = -2 to rotate counter-clockwise 180 deg
for (int row = 0; row < nY; row++) {
for (int col = 0; col < nX; col++) {
int row_p = cosf(n*M_PI_2)*(row-nY/2) - sinf(n*M_PI_2)*(col-nX/2) + nY/2;
int col_p = sinf(n*M_PI_2)*(row-nY/2) + cosf(n*M_PI_2)*(col-nX/2) + nX/2;
dataVector2[row*nX + col] = dataVector[row_p*nX + col_p];
}
}
// Later convert float array to image ...
请注意,在上面的代码中,我使用旋转坐标来访问原始数组的元素,然后将这些值映射回原始行 col 坐标:
dataVector2[row*nX + col] = dataVector[row_p*nX + col_p];
这样做的结果是 +n 值给出顺时针旋转;如果您想要逆时针旋转,只需将 n 的负值(即 -n)传递给您的代码,如上面的示例所示。这样做的效果是只改变上述旋转矩阵的非对角项的符号。
希望这可以帮助。