Frage

Stellen Sie sich vor hexagonalen Raum mit 3 Dimensionen.

Jede Kachel hat die Koordinaten XYZ. Ich brauche eine bestimmte Zelle Nachbarn in der gleichen Ebene zu wählen. Mit SQL ist es wie folgt aussieht:

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

Aber, ich mag es nicht, auf diese Weise. Vielleicht hat jemand wissen optimalere Algorithmen? Vielen Dank!

War es hilfreich?

Lösung

Das sieht aus wie Sie ein zwischen

verwenden können,
x BETWEEN $x-1 AND $x+1 AND y BETWEEN $y-1 AND $y+1 AND z = $z

Dies könnte nicht genau arbeiten, für den $ TBDIR Abschnitt. Ich werde in diesem Fall genauer ansehen.

OK, sondern versuchen, diese

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)

oder auch

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

Andere Tipps

Es gibt eine einfache Zuordnung, wenn Ihre Algorithmen mit einem nicht-orthogonalen Koordinatensystem arbeiten können. In Ihrem Fall, das der Teil der Hex-Fliese zu einer Achse parallel ist, scheint senkrecht zu sein:

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

Wenn Sie eine Skew Y-Achse annehmen können, dann können Sie geben a, d, g die X Koordinate 0 (das heißt die Y-Achse geht durch die Zentren dieser Fliesen). (beh würde X == 1, cfi hat X == 2 und so weiter haben). x hat Koordinate (-1,2). Jetzt können Sie wie folgt bewegen:

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

Wie Sie sehen können, sind die Bewegungen nun völlig unabhängig von der y-Position.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top