`

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

阅读更多
http://bbs.9ria.com/viewthread.php?tid=71405&extra=page%3D1%26amp;orderby%3Ddateline%26amp;filter%3D86400

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

最终结论:

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

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

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数组 用来做啥的?
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics