Domanda

Imagine spazio esagonale con 3 dimensioni.

Ogni pezzo ha le coordinate XYZ. Ho bisogno di selezionare un dato vicini di cella sullo stesso piano. Con SQL è appare come:

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

Ma, non mi piace questo modo. Forse qualcuno sa algoritmi più ottimali? Grazie!

È stato utile?

Soluzione

Questo appare come è possibile utilizzare una tra le

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

Questo potrebbe non esattamente lavorare per la sezione $ tbDir. Avrò uno sguardo a questo caso in modo più dettagliato.

OK, piuttosto provate questo

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)

o anche

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

Altri suggerimenti

C'è una mappatura facile se gli algoritmi possono lavorare con un sistema di coordinate non ortogonali. Nel suo caso, la parte della piastrella esagono che è parallelo ad un asse verticale sembra essere:

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

Se si può accettare un asse Y skew, allora si può dare a, d, g coordinata X 0 (vale a dire l'asse Y passa attraverso i centri di queste piastrelle). (beh avrebbe X == 1, cfi ha X == 2 e così via). x ha coordinate (-1,2). Ora è possibile spostare in questo modo:

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

Come si può vedere, i movimenti sono ora completamente indipendente dalla posizione y.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top