假设有如下一幅地图(左边为数组地图,右边为对应的位图地图),这幅地图对应的是一个一维数组int map[16],且我们知道总共有4行,4列,对于数组中的元素我们可以通过下面的公式求出它所在的行列, 第n个元素的行值为n/py,其中py为总列数(4),而列值为n%py.
经过45度的旋转后,我们想要得到的地图将变为(左边为数组地图,右边为将黑色背景作透明处理后对应的位图地图)
我们将45度地图中与原来位图的对应行列用红色标记起来,这里我们只标记一部分点,因为用这几个点就可以解释整个地图的旋转
假设数组中第一个元素,既1的位置在(x,y),我们可以发现原来的90度数组中,行列值相同,既6,11,16这几个点在旋转后,相对与点1的位置,横坐标没有发生改变,而知识纵坐标改变,而差值恰好是位图高度,然后我们观察,6这个点的纵坐标为y+1*32,且6在原数组中的行列值是(1,1),11这个点的纵坐标为y+2*32,且11在原数组中的行列值是(2,2),16这个点的纵坐标为y+3*32,且16在原数组中的行列值是(3,3),由此我们可以推断出,在原数组中行值与列值相同的元素,他的坐标为(x,y+n*32),其中n为行值或者列值,在这里他们是相等的,好了,现在我们解决了一种情况,还剩下两种,一个是行值大于列值,一个是列值大于行值,现在我们来看看下面这幅图
上面的图片我们给出了几张位图所粘贴的坐标,我们可以发现一个规律,凡是在原数组中行数大于列数的,如5,9,10,他们的横坐标都存在一个n*32和一个m*16,归纳一下可以得出,n是列数-行数的结果列数-行数的结果,例如元素5,他的n就为0-1 = -1,而m是列数+行数的结果,例如元素5,他的m就为0+1 = 1,而对于原数组中列数大于行数的,如2,3,7,他们的横坐标也都存在一个n*32和一个m*16,归纳一下可以得出,n是列数-行数的结果列数-行数的结果,例如元素2,他的n就为1-0 = 1,而m是列数+行数的结果,例如元素2,他的m就为0+1 = 1
下面是整个算法的代码(以上所有的第1个元素其实就是数组中下标为1的元素):
- x_index = i% py //第i个元素在原数组中的列数
- y_index = i/ py; //第i个元素在原数组中的行数
- w=mapW/2; //地图元素的一半
- h=mapH/2; //地图元素的一半
- if(x_index == y_index) //行数等于列数
- {
- x = 0;
- y = x_index * h;
- }
- if(x_index > y_index) //列数大于行数
- {
- x = (x_index-y_index) * w;
- y = (y_index+x_index) * h
- }
- if(y_index > x_index) //行数大于列数
- {
- x = (y_index-x_index) * w;
- y = (y_index+x_index) * h;
- }