Pregunta

Imagínese espacio hexagonal con 3 dimensiones.

Cada mosaico tiene las coordenadas XYZ. Necesito seleccionar una célula dada vecinos en el mismo plano. Con SQL se ve así:

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

Sin embargo, no me gusta esta manera. Tal vez alguien sabe algoritmos más óptimos? Gracias!

¿Fue útil?

Solución

Esto parece que se puede utilizar una entre

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

Esto podría no funcionar exactamente de la sección $ tbDir. Voy a echar un vistazo a este caso con más detalle.

OK, más bien tratar este

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 incluso

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

Otros consejos

Hay una asignación fácil si los algoritmos pueden trabajar con un sistema de coordenadas no ortogonales. En su caso, la parte de la baldosa hexagonal que es paralela a un eje vertical, parece ser:

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

Si usted puede aceptar un sesgo eje Y, a continuación, puede dar a, d, g la coordenada X 0 (es decir, el eje Y pasa a través de los centros de estas baldosas). (beh tendría X == 1, cfi tiene X == 2 y así sucesivamente). x ha la coordenada (1,2). Ahora puede mover de esta manera:

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

Como se puede ver, los movimientos son ahora completamente independiente de la posición y.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top