6

I have a triangulated isometric grid, like this: alt text
(source: mathforum.org)

In my code, triangles are grouped by columns.

As I hover the mouse, I want to calculate what triangle the mouse coordinates are in. Is there a simple algorithm to do that?

4

2 回答 2

4

你想要做的是尽可能把它变成一个网格,因为网格更容易使用。

你要做的第一件事是计算出它在哪一列。你说你存储它,所以通过在 x 坐标上通过框开始偏移的列宽进行简单的整数除法应该更容易。简单的。

之后,您想弄清楚它在哪个三角形中(显然)。你如何部分地将它变成一个网格是你假装你有一堆直角三角形而不是一堆等距三角形。

三角形沿 y 轴(柱的一侧)有一个长度。将该数字一分为二,然后计算出你下降了多少步。根据向下的步数以及列是偶数还是奇数,将告诉您您是否正在查看:

+--------+
|-_      |
|  -_    |
|    -_  |
|      -_|
+--------+

或相反。此时你只需要确定它在直线的哪一侧就可以确定它在哪个直角三角形中,这也告诉你它在哪个等距三角形中。

你有几个选择。

  1. 您可以使用诸如 Bresenham 的线算法之类的方法对斜边进行光栅化,当您点击该列时,您可以计算出您是在该线之上还是之下;
  2. 因为你在这里只有两个可能的网格(一个是另一个的相反,所以它实际上只有一个)。您可以存储一个行值数组,表示对于第 3 列,斜边在偏移量 2 处,而对于 6,它在 4 处,依此类推。

您甚至可以使用 (1) 生成 (2) 作为快速查找。

唯一要考虑的另一件事是如果鼠标光标位于边缘会发生什么?

于 2010-02-15T04:32:02.587 回答
4

这类似于 cletus 所说的,但我想用不同的方式看待它。

我假设三角形边是1。

假设您有如下网格:

       y'
      /
     /__/__/__/__/__/__/
    /__/__/__/__/__/__/
   /__/__/__/__/__/__/____ x'
(0,0)

如果您在 x 和 y 轴成 60 度角的坐标系中考虑网格,则在角度系统中的坐标 (x',y') 将对应于坐标系中的坐标正交系统(具有相同的原点和轴的一般方向)到(x,y)。

在你的问题中,给你(x,y),我们需要找到(x',y')然后找出三角形。

如果 i 是沿 x 的单位向量,而 j 是沿 y 的正交向量,那么我们有

x'* i + y'( i/2 + sqrt(3) * j /2) = xi + yj.

(基本上沿'有角度'的y轴的单位向量是i/2 + sqrt(3)/2 * j。沿x轴的单位向量与正常的x轴相同,即i)。

因此

x' + y'/2 = x
y' * sqrt(3)/2 = y

求解给出:

y' = 2*y/sqrt(3)
x' = x - y/sqrt(3)

现在假设 x' 和 y' 是正数。

现在如果 c = [x'],x' 的整数部分

和 r = [y'],y' 的整数部分

然后在(角度)网格中,该点位于第 c 列和第 r 行。(向右和向上计数并从 0 开始计数)。

因此,我们已将您的点缩小到平行四边形

       ____
      /\ * /   
     /___\/
   (c,r)

现在为了找出它在哪个三角形中,您可以考虑 x' 和 y' 的小数部分。

{x} = x' - [x'] = x' - c.
{y} = y' - [y'] = y' - r.

现在,

如果{x} + {y} > 1,则该点位于标有 * 的三角形中。如果{x} + {y} < 1,则该点位于另一个三角形中。如果{x} + {y} = 1,则该点位于两个三角形的公共线上。

希望这也有帮助。

于 2010-02-15T08:45:49.283 回答