如何将鼠标坐标转换为等距索引?


21

我用图块64x32绘制等距图:

const Offset = 160;
int X, Y;

for (int a=0; a < 6; a++)
  for (int b=0; b < 6; b++) {
    X = a * 32 - b * 32 + Offset;
    Y = a * 16 + b * 16;
    DrawTile(X, Y, tile);
  }

图片,说明此代码:

图片,说明此代码:

亲爱的专业人员,请提供有关细胞等轴测索引中的鼠标坐标转换公式的帮助。例如:(105; 100)-> [1; 4]。



旁注:如果您实际上不想要访问要递增的变量的先前值,例如在while(val = arr[i++])类似的构造中,请不要使用它。使用++a++b代替。
马丁·索卡

Answers:


25

您需要确定从平铺空间坐标到屏幕空间坐标的转换矩阵,然后为此计算逆矩阵,将其应用于屏幕空间坐标时将其转换为平铺空间坐标。

顺便说一句:您的偏移量实际上指向的是在任何理智的坐标系中都为(0.0,1.0)的位置,但这不是一个大问题,只是要记住一点。这意味着变换后的坐标系原点的偏移量为(偏移量+ 32,0)。


具体情况

将图块空间(a,b)坐标转换为屏幕空间(x,y)坐标的基本操作是通过以下转换矩阵运行它:

在此处输入图片说明

定义:瓦片(0,0)的ab在[0.0,1.0)范围内,其中(0.0,0.0)是上角,(1.0,1.0)是下角,(0.0,1.0)是左角和(1.0,0.0)在屏幕空间的右上角。

我们将坐标定义扩展为恒定的第三个坐标(总是正好为1),以便能够将平移合并到矩阵中。

现在,您可以为该变换创建逆矩阵。基本公式是:

在此处输入图片说明

...与Ç作为辅因子的矩阵

在您的情况下,行列式| A | 不管偏移量如何,始终为1024,因此逆矩阵为:

在此处输入图片说明


计算示例

现在,为您的示例数据...

将您要抵消的数字放在公式中,您将得到:

在此处输入图片说明

将(105、100、1)(屏幕坐标)与矩阵相乘可以得到:

在此处输入图片说明 在此处输入图片说明

由于第三个坐标始终为1,因此无需计算。四舍五入到最接近的整数,您将得到(1,4)作为图块空间坐标,这与预期的一样。


通用二元投影矩阵

如果您具有这样的角度,每个图块的宽度为2 w(示例中为64,因此w = 32),高度为2 h(示例中为32,因此h = 16),并且原点偏移在屏幕空间分别为水平轴和垂直轴的f x和f y(示例中为192和0)时,矩阵如下所示。

平铺屏幕空间

在此处输入图片说明

屏幕空间到平铺空间

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.