2

我正在努力将鼠标/屏幕坐标转换为等距平铺索引。我已经尝试了在这里或互联网上可以找到的所有公式,但它们似乎都不起作用,或者我遗漏了一些东西。

在此处输入图像描述

这是一张图片,原点在左上角,一个图块的尺寸是 128x64px。

我会很感激任何帮助,谢谢。

4

2 回答 2

6

基本上,您需要应用带有其他一些位的旋转矩阵。下面是一些用 AWK 编写的示例代码,应该很容易移植到任何其他语言:

END {
   PI = 3.1415;
   x = 878.0;
   y = 158.0;

   # Translate one origin to the other 
   x1 = x - 128*5;
   # Stretch the height so that it's the same as the width in the isometric
   # This makes the rotation easier
   # Invert the sign because y is upwards in math but downwards in graphics
   y1 = y * -2;

   # Apply a counter-clockwise rotation of 45 degrees
   xr = cos(PI/4)*x1 - sin(PI/4)*y1;
   yr = sin(PI/4)*x1 + cos(PI/4)*y1;

   # The side of each isometric tile (which is now a square after the stretch) 
   diag = 64 * sqrt(2);
   # Calculate which tile the coordinate belongs to
   x2 = int(xr / diag);
   # Don't forget to invert the sign again
   y2 = int(yr * -1 / diag);

   # See the final result
   print x2, y2;
}

我用几个不同的坐标对其进行了测试,结果似乎是正确的。

于 2013-10-31T23:53:31.003 回答
0

我尝试了 acfrancis 的解决方案,发现该函数在处理负索引时有其局限性。以防万一其他人会解决这个问题:问题原因:负值如 -0.1.... 将被强制转换为 0 而不是 -1。它是数组的经典“只有一个零”问题。

解决它:在将 x2、y2 值转换为 int 之前:检查 xr/diag < 0,如果为真,则 result = result - 1(分别对于 y2:yr * -1 / diag < 0 then result = result -1 ) 然后你像以前一样将结果值转换为 int 。

希望能帮助到你。

另外: 128 * 5 的原点翻译似乎特定于某种情况,所以我想这应该被删除以概括该功能。

于 2018-01-31T17:16:10.247 回答