假设我有一张身高H
和宽度W
的图片。图像的原点是左上角,以传统方式增加(y向下增加,x增加到右边)。我们选择一个块大小b
并将图像划分为b x b
块,可能在右边和底边有剩余部分,大小为rx x ry
,rx x b
,和b x ry
。 rx
和ry
是模b
模式的剩余部分,因此rx = W % b
和ry = H % b
。
以下是设置的描述:
如果图像高度和/或宽度是rx
的整数倍,则 ry
和b
也可以为0。绿色斑点位于(block_upper_left_x, block_upper_left_y)
,并编码块出现在图像上的位置。
我想通过在x轴和y轴的中线上平移各个块来转换此图像。生成的图像如下所示:
这与简单地在水平和垂直方向上翻转不同,后者给出了这个图像:
我在一个表示这些块的数据结构中得到了图像,块高度和宽度以及底层位图。它看起来与此相似:
(block_width, block_height, block_upper_left_x, block_upper_left_y, bitmap[])
给定块中的位图不会更改,只是块相对于彼此的位置。
理想情况下,我希望找到一些只是简单地更改block_upper_left_x
和block_upper_left_y
的映射,但是铅笔和纸张的尝试让我没有太大的意义。这是我制作的一个表格,可能有助于指导思考:
block_id | (block_ul_x_0, block_ul_y_0) | (block_ul_x_f, block_ul_y_f) | (d_ul_x, d_ul_y)
==============================================================================================
0 | (0, 0) | (rx + b, 2b) | (rx + b, 2b)
1 | (b, 0) | (rx, 2b) | (rx - b, 2b)
2 | (2b, 0) | (0, 2b) | (-2b, 2b)
3 | (0, b) | (rx + b, b) | (rx + b, 0)
4 | (b, b) | (rx, b) | (rx - b, 0)
5 | (2b, b) | (0, b) | (-2b, 0)
6 | (0, 2b) | (rx + b, 0) | (rx + b, -2b)
7 | (b, 2b) | (rx, 0) | (rx - b, -2b)
8 | (2b, 2b) | (0, 0) | (-2b, -2b)