2 Stimmen

Auswahl der benachbarten Zellen in einem hexagonalen Feld

Stellen Sie sich einen sechseckigen Raum mit 3 Dimensionen vor.

Jede Kachel hat die Koordinaten XYZ. Ich muss eine bestimmte Zelle Nachbarn in der gleichen Ebene zu wählen. Mit SQL sieht das so aus:

$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 diesen Weg nicht. Vielleicht weiß jemand mehr optimale Algorithmen? Ich danke Ihnen!

4voto

Adriaan Stander Punkte 155899

Dies sieht so aus, als könnten Sie eine zwischen

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

Dies könnte für den Abschnitt $tbDir nicht ganz funktionieren. Ich werde mir diesen Fall noch genauer ansehen.

OK, versuchen Sie lieber Folgendes

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 sogar

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

3voto

Aaron Digulla Punkte 308693

Es gibt eine einfache Abbildung, wenn Ihre Algorithmen mit einem nicht orthogonalen Koordinatensystem arbeiten können. In Ihrem Fall scheint der Teil der Hex-Kachel, der parallel zu einer Achse liegt, vertikal zu sein:

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

Wenn Sie eine schiefe Y-Achse akzeptieren können, dann können Sie a , d , g die X-Koordinate 0 (d. h. die Y-Achse geht durch die Mittelpunkte dieser Kacheln). ( beh würde X == 1 sein, cfi hat X == 2 und so weiter). x hat die Koordinate (-1,2). Jetzt können Sie sich 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.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X