質問

3次元で六角形のスペースを想像します。

各タイルは、XYZの座標ました。 私は、同じ平面上に与えられたセルの隣人を選択する必要があります。

:SQLで、それは次のようになります
$tbDir = $y % 2 == 0 ? -1 : 1;

$result =  db_query('SELECT x,y,z FROM {cells} WHERE
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d OR
                    x = %d AND y = %d AND z = %d ',
                    $x, $y, $z,
                    $x-1, $y, $z,
                    $x+1, $y, $z,
                    $x, $y-1, $z,
                    $x, $y+1, $z,
                    $x+$tbDir, $y-1, $z,
                    $x+$tbDir, $y+1, $z);

しかし、私はこの方法が好きではありません。 おそらく誰かが、より最適なアルゴリズムを知っていますか? ありがとうございます!

役に立ちましたか?

解決

あなたが

との間に使用することができますように

これが見えます

x BETWEEN $x-1 AND $x+1 AND y BETWEEN $y-1 AND $y+1 AND z = $z

これはまさに$ tbDirセクションのために動作しない場合があります。私は、より詳細にこのケースを見てます。

OK、むしろこれを試してみてください。

WHERE   x BETWEEN ($x-1 AND $x+1 AND y = $y AND z = $z)
OR      (y BETWEEN $y-1 AND $y+1 AND x = $x AND z = $z)
OR      (y BETWEEN $y-1 AND $y+1 AND x = $x + $tbDir AND z = $z)

あるいは

WHERE   (   (x BETWEEN $x-1 AND $x+1 AND y = $y )
            OR      (y BETWEEN $y-1 AND $y+1 AND x = $x)
            OR      (y BETWEEN $y-1 AND $y+1 AND x = $x + $tbDir)
        )
AND     z = $z

他のヒント

あなたのアルゴリズムは非直交座標系で動作することができます場合は、

簡単なマッピングがあります。あなたのケースでは、軸に平行である六角形のタイルの一部が垂直であるように思わます:

 / \ / \ / \
| a | b | c |
 \ / \ / \ / \
  | d | e | f |
 / \ / \ / \ /
| x | g | h | i
もしスキューY軸を受け入れることができる場合は、

、あなたは(すなわち、Y軸はこれらのタイルの中心を通過する)、Xは0座標adgを与えることができます。 (behcfiはX == 2を有しているというように、X == 1を有するであろう)。 xは(-1,2)の座標を有します。今、あなたはこのように移動することができます:

e -> f: x+1,y
e -> d: x-1,y
e -> b: x,  y-1
e -> c: x+1,y-1
e -> g: x-1,y+1
e -> h: x,  y+1
あなたが見ることができるように

、動きは今のy位置の完全に独立しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top