45度地图之整体旋转

来源:互联网 发布:kaicong软件下载 编辑:程序博客网 时间:2024/04/28 18:53

假设有如下一幅地图(左边为数组地图,右边为对应的位图地图),这幅地图对应的是一个一维数组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的元素):

 

 

 

  1.           x_index = i% py                //第i个元素在原数组中的列数 
  2.           y_index = i/  py;                //第i个元素在原数组中的行数 
  3.          w=mapW/2;       //地图元素的一半
  4.          h=mapH/2;       //地图元素的一半
  5.          if(x_index == y_index)     //行数等于列数 
  6.           {
  7.               x = 0;
  8.               y = x_index * h;
  9.          }
  10.          if(x_index > y_index)        //列数大于行数 
  11.          {
  12.                x = (x_index-y_index) * w;
  13.                y =  (y_index+x_index) * h
  14.            }
  15.           if(y_index > x_index)        //行数大于列数 
  16.           {
  17.              x = (y_index-x_index) * w;
  18.              y = (y_index+x_index) * h;
  19.            }
原创粉丝点击