次のような三角形分割された等角グリッドがあります:
(ソース: mathforum.org )
私のコードでは、三角形は列ごとにグループ化されています。
マウスをホバーすると、マウス座標がどの三角形にあるかを計算したいのですが、それを行う簡単なアルゴリズムはありますか?
次のような三角形分割された等角グリッドがあります:
(ソース: mathforum.org )
私のコードでは、三角形は列ごとにグループ化されています。
マウスをホバーすると、マウス座標がどの三角形にあるかを計算したいのですが、それを行う簡単なアルゴリズムはありますか?
これはクレタスが言ったことと似ていますが、別の見方をしていると思います。
三角形の辺が 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
、点は 2 つの三角形の共通線上にあります。
それも役立つことを願っています。
やりたいことは、これを可能な限りグリッドに変換することです。グリッドの方が作業がはるかに簡単だからです。
最初に行うことは、それがどの列にあるかを調べることです。それを保存すると言うので、ボックスの開始点によってオフセットされた列幅で x 座標を単純な整数除算することで簡単になるはずです。簡単。
その後、それがどの三角形にあるかを調べたいと思います(明らかに)。これを部分的にグリッドに変える方法は、等角三角形のスタックではなく、直角三角形のスタックを持っているふりをすることです。
三角形には、y 軸 (列の側面) に沿った長さがあります。その数を 2 で割り、自分が何歩下がっているかを計算します。ステップダウンの数に基づいて、列が偶数か奇数かによって、以下を見ているかがわかります。
+--------+
|-_ |
| -_ |
| -_ |
| -_|
+--------+
またはその逆。この時点で、それがどの直角三角形にあるかを判断するには、線のどちら側にあるかを判断する必要があるだけです。これにより、どの等角三角形にあるかもわかります.
これにはいくつかのオプションがあります。
(1) を使用して (2) を高速ルックアップとして生成することもできます。
他に考慮すべき唯一のことは、マウス カーソルが端にある場合に何が起こるかということです。