I have a triangulated isometric grid, like this:
(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?
I have a triangulated isometric grid, like this:
(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?
你想要做的是尽可能把它变成一个网格,因为网格更容易使用。
你要做的第一件事是计算出它在哪一列。你说你存储它,所以通过在 x 坐标上通过框开始偏移的列宽进行简单的整数除法应该更容易。简单的。
之后,您想弄清楚它在哪个三角形中(显然)。你如何部分地将它变成一个网格是你假装你有一堆直角三角形而不是一堆等距三角形。
三角形沿 y 轴(柱的一侧)有一个长度。将该数字一分为二,然后计算出你下降了多少步。根据向下的步数以及列是偶数还是奇数,将告诉您您是否正在查看:
+--------+
|-_ |
| -_ |
| -_ |
| -_|
+--------+
或相反。此时你只需要确定它在直线的哪一侧就可以确定它在哪个直角三角形中,这也告诉你它在哪个等距三角形中。
你有几个选择。
您甚至可以使用 (1) 生成 (2) 作为快速查找。
唯一要考虑的另一件事是如果鼠标光标位于边缘会发生什么?
这类似于 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
,则该点位于两个三角形的公共线上。
希望这也有帮助。