Pergunta

Imagine o espaço hexagonal com 3 dimensões.

Cada peça tem coordenadas XYZ. Eu preciso selecionar um determinado vizinhos celulares no mesmo plano. Com o SQL é se parece com:

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

Mas, eu não gosto dessa forma. Talvez alguém sabe algoritmos mais ideal? Obrigado!

Foi útil?

Solução

Isto parece que você pode usar um entre

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

Isso talvez não exatamente o trabalho para a seção $ tbDir. Vou ter um olhar para este caso com mais detalhes.

OK, em vez tentar 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)

ou mesmo

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

Outras dicas

Há um mapeamento fácil se os seus algoritmos podem trabalhar com um sistema não-ortogonal de coordenadas. No seu caso, a parte da telha hex que é paralela a um eixo parece ser vertical:

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

Se você pode aceitar um eixo Y inclinação, então você pode dar a, d, g a coordenada X 0 (ou seja, o eixo Y atravessa os centros de estas telhas). (beh teria X == 1, cfi tem X == 2 e assim por diante). x tem a coordenada (1,2). Agora você pode mover-se assim:

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 você pode ver, os movimentos são agora completamente independente da posição y.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top