2

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);

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

4

2 に答える 2

4

これはあなたが間を使うことができるように見えます

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
于 2009-12-07T13:40:15.440 に答える
3

アルゴリズムが非直交座標系で機能する場合、簡単なマッピングがあります。あなたの場合、軸に平行な六角タイルの部分は垂直に見えます:

 / \ / \ / \
| a | b | c |
 \ / \ / \ / \
  | d | e | f |
 / \ / \ / \ /
| x | g | h | i

Y 軸の傾きを受け入れることができる場合は、X 座標 0 を与えることができます(aつまり、Y 軸はこれらのタイルの中心を通ります)。( X == 1、X == 2 など)。座標は (-1,2) です。これで、次のように移動できます。dgbehcfix

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 位置から完全に独立しています。

于 2009-12-07T13:51:11.537 に答える