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!

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top