Search code examples
sqlmysqlalgorithmhexagonal-tiles

Selection of neighbors cells in a hexagonal field


Imagine hexagonal space with 3 dimensions.

Each tile has coordinates XYZ. I need to select a given cell neighbors in the same plane. With SQL it's looks like:

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

But, i don't like this way. Perhaps someone know more optimal algorithms? Thank you!


Solution

  • This looks like you can use a between

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

    This might not exactly work for the $tbDir section. I will have a look at this case in more detail.

    OK, rather try this

    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)
    

    or even

    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