6

次のような三角形分割された等角グリッドがあります: (ソース: mathforum.org )代替テキスト

私のコードでは、三角形は列ごとにグループ化されています。

マウスをホバーすると、マウス座標がどの三角形にあるかを計算したいのですが、それを行う簡単なアルゴリズムはありますか?

4

2 に答える 2

4

これはクレタスが言ったことと似ていますが、別の見方をしていると思います。

三角形の辺が 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 つの三角形の共通線上にあります。

それも役立つことを願っています。

于 2010-02-15T08:45:49.283 に答える
4

やりたいことは、これを可能な限りグリッドに変換することです。グリッドの方が作業がはるかに簡単だからです。

最初に行うことは、それがどの列にあるかを調べることです。それを保存すると言うので、ボックスの開始点によってオフセットされた列幅で x 座標を単純な整数除算することで簡単になるはずです。簡単。

その後、それがどの三角形にあるかを調べたいと思います(明らかに)。これを部分的にグリッドに変える方法は、等角三角形のスタックではなく、直角三角形のスタックを持っているふりをすることです。

三角形には、y 軸 (列の側面) に沿った長さがあります。その数を 2 で割り、自分が何歩下がっているかを計算します。ステップダウンの数に基づいて、列が偶数か奇数かによって、以下を見ているかがわかります。

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

またはその逆。この時点で、それがどの直角三角形にあるかを判断するには、線のどちら側にあるかを判断する必要があるだけです。これにより、どの等角三角形にあるかもわかります.

これにはいくつかのオプションがあります。

  1. Bresenham のライン アルゴリズムのようなものを使用して斜辺をラスタライズできます。列にヒットすると、そのラインの上または下にいる場合はうまくいきます。
  2. ここには 2 つの可能なグリッドしかないためです (一方は他方の逆であるため、実際には 1 つだけです)。行の値の配列を格納すると、列 3 では斜辺がオフセット 2 にあるのに対し、列 6 では斜辺は 4 などになります。

(1) を使用して (2) を高速ルックアップとして生成することもできます。

他に考慮すべき唯一のことは、マウス カーソルが端にある場合に何が起こるかということです。

于 2010-02-15T04:32:02.587 に答える