2010-02-15 64 views

回答

4

你想要做的就是尽可能地把它变成一个网格,因为网格很容易处理。

你要做的第一件事就是确定它所在的列。你说你存储它,所以它应该更容易做一些简单的整数除法。简单。

之后,你想弄清楚它显示的是什么三角形。如何将其部分转换为网格,是假设您有一堆直角三角形而不是一堆等轴三角形。

三角形沿着y轴(列的一侧)有一个长度。将这个数字分成两部分,计算出你有多少步骤。根据下降的步骤数,如果列是偶数或奇数会告诉你,如果你正在看:

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

或相反。此时,您只需确定它所在的线条的哪一侧以确定其所在的哪个直角三角形,这也会告诉您它处于哪个等角三角形中。

您有几个选项可供选择。

  1. 你可以使用类似Bresenham的线算法来对斜边进行光栅化处理,并且当你点击列时,如果你在该行的上方或下方,就可以开始工作;
  2. 因为你在这里只有两个可能的网格(一个是另一个的反向,所以它实际上只有一个)。你可以存储一个行值的数组,说第3列的斜边是在偏移量2,而6是4,依此类推。

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

唯一要考虑的其他事情是如果鼠标光标在边缘上会发生什么?

3

这与cletus所说的类似,但是我认为它有不同的看法。

我假定三角形侧1.

假设有如下的网格:

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

如果考虑在一个坐标系统中的网格,其中在x & y轴在角度系统(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开始计数)。

因此,我们为了找出它是三角形的话,可以考虑x的小数部分“和y”你点缩小到一个平行四边形

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

现在。

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

现在,

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

希望也有帮助。