La sélection de cellules voisin dans un domaine hexagonal
-
13-09-2019 - |
Question
Imaginez l'espace hexagonal avec 3 dimensions.
Chaque tuile a des coordonnées XYZ. Je dois choisir un voisin de cellule donnée dans le même plan. Avec SQL il est ressemble à:
$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);
Mais, je ne l'aime pas de cette façon. Peut-être quelqu'un sait des algorithmes plus optimaux? Merci!
La solution
Cela ressemble, vous pouvez utiliser entre
x BETWEEN $x-1 AND $x+1 AND y BETWEEN $y-1 AND $y+1 AND z = $z
Cela pourrait ne pas fonctionner exactement pour la section tbDir $. Je vais avoir un regard sur ce cas plus en détail.
OK, plutôt essayer
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)
ou même
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
Autres conseils
Il est une application facile si vos algorithmes peuvent fonctionner avec un système de coordonnées non orthogonal. Dans votre cas, la partie de la tuile hexagonale qui est parallèle à un axe vertical semble être:
/ \ / \ / \
| a | b | c |
\ / \ / \ / \
| d | e | f |
/ \ / \ / \ /
| x | g | h | i
Si vous pouvez accepter un axe d'inclinaison Y, alors vous pouvez donner a
, d
, g
la coordonnée X 0 (à savoir l'axe Y passe par les centres de ces tuiles). (beh
aurait X == 1, cfi
a X == 2 et ainsi de suite). x
a les coordonnées (-1,2). Maintenant, vous pouvez déplacer comme ceci:
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
Comme vous pouvez le voir, les mouvements sont maintenant complètement indépendant de la position y.