[转][提问] 45度坐标转换(万年坑)浪子与小超的算法都有误差..

[url]http://bbs.9ria.com/viewthread.php?tid=71405&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D86400[/url]

首先感谢两位前辈在研究完之后放出原代码。
让我们这些后来者能够循着前人的脚步快速进步。

最终结论:

浪子的 我不太理解........... 貌似是在两套坐标系中转来转去............我晕!太高深了!

小超的那个,经过一番查证得出个结论:

TMD 少一行代码 害死人啊!

下面贴出 Staggered 坐标转换正确代码

/**
* 根据屏幕象素坐标取得网格的坐标
* */
public static function StageToLogic(px:int, py:int):Point
{
var xtile:int = 0; //网格的x坐标
var ytile:int = 0; //网格的y坐标

var cx:int, cy:int, rx:int, ry:int;
cx = int(px / TileWidth) * TileWidth + TileWidth/2; //计算出当前X所在的以tileWidth为宽的矩形的中心的X坐标
cy = int(py / TileHeight) * TileHeight + TileHeight/2;//计算出当前Y所在的以tileHeight为高的矩形的中心的Y坐标

rx = (px - cx) * TileHeight/2;
ry = (py - cy) * TileWidth/2;

if (Math.abs(rx)+Math.abs(ry) <= TileWidth * TileHeight/4)
{
//xtile = int(pixelPoint.x / tileWidth) * 2;
xtile = int(px / TileWidth);
ytile = int(py / TileHeight) * 2;
}
else
{
px = px - TileWidth/2;
//xtile = int(pixelPoint.x / tileWidth) * 2 + 1;
xtile = int(px / TileWidth) + 1;

py = py - TileHeight/2;
ytile = int(py / TileHeight) * 2 + 1;
}

return new Point(xtile - (ytile&1), ytile);
}
/**
* 根据网格坐标取得象素坐标
* */
public static function LogicToStage(tx:int, ty:int):Point
{
/**
* 偶数行tile中心
* */
var tileCenter:int = (tx * TileWidth) + TileWidth/2;
/**
* x象素 如果为奇数行加半个宽
* */
var xPixel:int = tileCenter + (ty&1) * TileWidth/2;

/**
* y象素
* */
var yPixel:int = (ty + 1) * TileHeight/2;

return new Point(xPixel, yPixel);
}



这里还有一个
http://bbs.9ria.com/thread-39884-1-1.html

再说一下我的做法,就是切成矩形栅格,然偶看点落在哪个矩形里,再看点落在矩形中的哪个三角形中,最后根据三角形类型(是菱形的哪部分),以及当前矩形的行列值,就可以算出来了


看了半天不太明白,你想问的具体问题是什么?

在我的算法中45度坐标转换中有如下几个方法

1、屏幕坐标转stage方式二维数组坐标
已知某屏幕坐标求stage 方式二维数组的下标

2、屏幕坐标转iso方式 二维数组坐标
已知某屏幕坐标求iso 方式二维数组的下标(iso数组二维下标有负数)

3、屏幕坐标转iso坐标
已知某屏幕坐标求iso坐标(iso坐标值有负数)

4、stage二维数组坐标转iso二维数组坐标
已知stage数组中某个下标求对应的iso数组中的坐标

5、45度数组坐标转90度数组坐标
同上,反转

注意事项:
1、整个算法中屏幕坐标系和iso坐标系的原点重合,位置在左上角0,0点。
2、Tile的坐标原点在小菱形的左顶点。


谢谢浪子的回答!
不过我还是不明白!

最不明白的是。我通过一个排列方式排列!
比如:
stage.x = logic.x * TileWidth + ( logic.y & 1) * ( TileWidth / 2 );
stage.y = logic.y * TileHeigth / 2;

logic表示 数组索引如(0,0);

那么反过来我点击舞台时 把舞台坐标转换成二维数组索引不就好了!
我的问题是 转过来 老有错。。。。。。

不明白你为什么 还有个iso数组 用来做啥的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值