45度地图之整体旋转
假设有如下一幅地图(左边为数组地图,右边为对应的位图地图),这幅地图对应的是一个一维数组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;
- }
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
