下面的代码由90度的倍数演示了一个浮阵列的旋转。我后来将float数组转换为一个字节数组,以便我可以生成测试图像来验证结果;我没有包含代码的那部分内容,因为它只是混淆了主要观点,实际上并不是你询问的内容。如果你需要那部分,让我知道我会发布它。
请注意,我做了“不在位”的轮换,而不是“在原地”。我相信后者就是你真正感兴趣的东西,但即使如此,下面的方法对你来说应该是一个好的开始。关于就地转换的其他讨论可以是found here,它围绕使用转置类型操作(内存交换),但我没有时间对所有这些细节进行分类,我将为你留下那部分内容。
当然这样看来:
但在
回想一下,对于N * 90度逆时针旋转,变换由下式给出实际代码需要分别通过imageHeight/2和imageWidth/2来转换行'和col',如下面的代码所示,以避免将负向索引传递到您的数组。
表示row_p和col_p作为行“和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)传递给您的代码,如上例所示。这样做的效果是仅改变上面旋转矩阵的非对角线项的符号。
希望这会有所帮助。
我建议你在方格纸上做一个简单的矩形,然后在矩形中用正方形的数字填充正方形。然后你“旋转”那个矩形。这样你会看到它其实很简单。 –
对,我已经完成了这个工作,并得到了旋转的工作方式。我的问题实际上并不是在旋转它,而是如何做几次。我不得不为每一次迭代创建新的指针,而且我不确定如何去做几次,如果我想实现这个目标,我必须多次创建一个新的指针, 270度旋转。 – user2824512
这是一样的。例如,旋转180度实际上比旋转90度更简单。所以对于一个270度的旋转,做一个180和一个90.你只需要两个“指针”,源和目标位图,这两个都是同样大(除了90和270度的宽度和高度开关位置)。 –