在这里更改之前说的45度角坐标转换的问题,地图仍然不变,但地图坐标和游戏坐标的关系改变了,它的对应关系如下图:
![](https://i-blog.csdnimg.cn/blog_migrate/be8431d511369d323c39f08cccce5733.png)
其中虚线表示地图的边缘,区块中标的数是数组的索引,即地图坐标。地图的高度用大写的H表示,区块的高度用小写的h表示,区块的宽度等于高度的两倍。
- 显示坐标转换成地图坐标
假设一个点(下图中的A点)的显示坐标为(x,y),地图坐标为(i,j),显示坐标转换成地图坐标就是要在已知x和y的情况下求i和j。
![](https://i-blog.csdnimg.cn/blog_migrate/c045b44656f8b0f8a6a28e29568b30aa.png)
i的值等于AB的长除菱形区块的边长取整,AB=AF+BF,△ADF是一个直角边比为1:2的直角三角形,其中直角边AD=x,因此AF=√5 —x 2 。△FBK是BF=BK等腰三角形,且底边上的高等于底边FK,FK=GE,GE=AE-AG,AG=x/2,因此BF=√5 — 2 (y-x/2)。最后
i=(AF+BF)/(√5 —h 2 )=[√5 —x 2 + √5 — 2 (y-x/2)]/√5 —h 2 =(y+x/2)/h。
对j的值求解则要分两种情况,即上图中的A点和O点,确定条件分别是x/2<H-h和x/2>=H-h。
在A点,j等于AC的长除菱形区块的边长取整,AC=AH+HC,HC=HI=AJ,AJ可以通过i的值求出。AH=√5 —x 2 ,AJ=菱形区块的边长-(AB-菱形区块的边长×i)=
√5 —h 2 -[√5 —x 2 + √5 — 2 (y-x/2)]+√5 —hi 2 ,
这是可以得出j=(x/2-y)/h+i+1。
在O点,同上面的道理一样,区别是求PQ,PQ=OS,最后计算的结果是j=(2H+x/2-y)/h-i。
结论:
i=(y+x/2)/h
j=(x/2-y)/h+i+1 当x/2<H-h时
j=(2H+x/2-y)/h-i 当x/2>=H-h时
- 地图坐标转换成显示坐标
此时要将上图中的(6,7)转换成Z点到地图左边缘和上边缘的像素值,这里先直接用显示坐标转换成地图坐标中的二元一次方程组求出x和y,同样分条件:
当i<H/h时:
x=hj-h
y=h(2i-j+1)/2
当i>=H/h时:
x=h(2i+j)-2H
y=H-hj/2
以上公式是直接求解出来的,当我们用放进去计算的时候x值是正确的,但y值总是比真实 值多了h/2。出现这种情况就要从对应关系上去思考,地图坐标系统中的点,比如(6,7),它实际对应于显示坐标系统中的点不是Z点,而是Z点下方h/2 位置处的点,把头向左转一点来看上图,可以看到地图坐标中,点(6,7)的左上角(左上角就是坐标点)就是显示坐标中Z点下方h/2位置处,因此更正后得 到转换公式:
当i<H/h时:
x=hj-h
y=h(2i-j)/2
当i>=H/h时:
x=h(2i+j)-2H
y=H-h(j+1)/2
- 总结
数学是很有意思的,原本以为这些公式会与地图倾斜的角度有关,但计算后根号5这个值不存在了,不过这样说也不完全对,因为菱形区块的高宽比正好是1比2,这样导致公式最后也简洁很多。
转至: http://www.cnblogs.com/pains/archive/2009/08/11/1541753.html