我有一个三角形的等距网格,如下所示:
在我的代码中,三角形按列分组。
当我将鼠标悬停在鼠标上时,我想计算鼠标坐标所在的三角形。是否有一个简单的算法可以做到这一点?
答案 0 :(得分:4)
您要做的是尽可能将其转换为网格,因为网格更容易使用。
你要做的第一件事是找出它所在的列。你说你存储它,所以通过在x坐标上做一个简单的整数除法,用列开始的列宽度偏移来更容易。容易。
之后你想弄清楚它的三角形(显然)。如何将其部分转换为网格是假装你有一堆直角三角形而不是一堆等距三角形。
三角形沿y轴(列的一侧)有一个长度。将该数字除以两个,计算出你的步数。根据步数下降,如果列是偶数或奇数,将告诉您是否正在查看:
+--------+
|-_ |
| -_ |
| -_ |
| -_|
+--------+
或反过来。此时,您只需要确定它所在行的哪一侧,以确定它所在的哪个直角三角形,这也会告诉您它所处的等角三角形。
你有几个选择。
您甚至可以使用(1)生成(2)作为快速查找。
唯一需要考虑的是如果鼠标光标位于边缘会发生什么?
答案 1 :(得分:3)
这与克莱图斯所说的类似,但我认为这是另一种看待它的方式。
我假设三角形边是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
,则该点位于两个三角形共有的线上。
希望也有帮助。