也许你想到通过解两个直线方程(点斜式):
不过这是个笨办法,那么有更简单的办法吗?
开门见山:
***********************************
N=int(x/TileW - y/TileH)
M=int(x/TileW + y/TileH)
***********************************
N,M是碎片的索引,从0开始。
TileW,TileH是碎片的长宽。
x,y是鼠标坐标,但是注意坐标系原点。
以上过程如下图演示:
那么,是什么原理呢?
我们建立一个新的坐标系。以花体字的u,v为新的基向量。
然后把鼠标坐标(注意原点!)(x,y)转换成基于新的基集t={u,v}的展开式:
使用的时候很简单
公式是
------------------------------------------------------------------------------------------------------------
下面说的是45度地图,地图坐标系在顶端的格子计算方法
关于45度角地图中像素坐标和地图坐标之间的转换,网上有各种方法,其实坐标转换就是计算tite宽和tile高在像素坐标中的偏移值,本方法是针对 tite块原点坐标在菱形的顶点的位置的坐标转换,在45度角地图中,方块形状为菱形,你可以用flash cs工具或其他绘图工具很快的创建出这种菱形方块,按以下3个步骤就可以了:
1、 绘制一个任意大小的正方形;
2、 把这个正方形旋转45度;
3、 把旋转的正方形的高度缩放为原来的50%。
还有一点就是方块尺寸的问题,菱形方块的宽度是高度的2倍,其次方块尺寸比例应该是2:1。例如64像素X 32像素或100像素 X 50像素等,这样的尺寸刚好能使方块在地图铺设的时候很好地排列在屏幕上。
至于坐标间的转换其实大家看图就好理解了:
图中是一个以红色(0,0)位置为原点,红点每向地图坐标系M轴上移动一个单位,原点相对像素坐标系X中的偏移值为:方块宽度/2
菱形方块宽 var tileW :Number;
菱形方块高 var tileH :Number;
地图的行数 var row :int;
地图的列数 var col :int;
红色原点坐标(像素坐标系) var originP : Point;
那么红色的原点坐标在地图坐标系中的位置为:
originP.x = row * tileW /2;
originP.y = 0;
原点坐标出来了,那么其它点的坐标呢?
思路是先求出在地图坐标系下(M方向或N方向)每移动一个单位的像素坐标系X轴和像素坐标系Y轴的像素偏移值。
如红色原点移动到黑色点的位置:
M在像素坐标系X轴的偏移像素 = tileW /2;(向右偏移)
M在像素坐标系Y轴的偏移像素 = tileH /2; (向下偏移)
N在像素坐标系X轴的偏移像素 = - tileW /2;(向左偏移)
N在像素坐标系Y轴的偏移像素 = tileH /2; (向下偏移)
假如有个地图坐标点(M,N),那么它对应的像素坐标系的点为var p:Point
p.x = 原点坐标X + M在像素坐标系X轴的偏移像素 × M + N在像素坐标系X轴的偏移像素 × N = originP.x + tileW /2 × M + (-tileW/2) × N = originP.x + (M – N) × tileW/2;
p.y = 原点坐标Y + M在像素坐标系Y轴的偏移像素 × M + N在像素坐标系Y轴的偏移像素 × N = originP.y + tileH/2 × M + tileH/2 × N = originP.y + (M + N) × tileH/2;
/
那么如何把直角坐标转X,Y换成菱形格子坐标M,N呢
M=(p.x-originP.x)/tileW + (p.y-originP.y)/tileH
N=(p.y-originP.y)/tileH - (p.x-originP.x)/tileW