Mein isometrisches 2D-Spiel verwendet eine hexagonale Gitterkarte. Wie drehe ich in Bezug auf das Bild unten die hellblauen Sechseckstrukturen um 60 Grad um die rosa Sechsecke?
BEARBEITEN:
Haupthex ist (0,0). Andere Felder sind Kinder, deren Anzahl festgelegt ist. Ich werde nur eine Position definieren (in diesem Fall die rechte) und bei Bedarf andere Richtungen berechnen (links unten, rechts unten, rechts oben, links oben und links). Andere Felder sind wie folgt definiert: Package.Add (-1,0), Package.Add (-2,0) und so weiter.
switch(Direction)
{
case DirRightDown:
if(Number.Y % 2 && Point.X % 2)
Number.X += 1;
Number.Y += Point.X + Point.Y / 2;
Number.X += Point.X / 2 - Point.Y / 1.5;
break;
}
In diesem Code Number
befindet sich das Haupthex und Point
das Hex, das ich drehen möchte, aber es funktioniert nicht:
2d
rotation
maps
hexagonal-grid
Ruzsoo
quelle
quelle
Antworten:
Wie Martin Sojka bemerkt, sind Rotationen einfacher, wenn Sie in ein anderes Koordinatensystem konvertieren, die Rotation durchführen und dann zurück konvertieren.
Ich benutze ein anderes Koordinatensystem als Martin
x,y,z
. In diesem System gibt es kein Wackeln und es ist nützlich für viele Hex-Algorithmen. In diesem System können Sie das Hex drehen,0,0,0
indem Sie die Koordinaten „drehen“ und ihre Vorzeichen umdrehen:x,y,z
Dreht sich in die-y,-z,-x
eine und in-z,-x,-y
die andere Richtung. Ich habe ein Diagramm auf dieser Seite .(Es tut mir leid wegen x / y / z gegen X / Y, aber ich verwende x / y / z auf meiner Website und Sie verwenden X / Y in Ihrem Code, sodass in dieser Antwort der Fall wichtig ist! Also werde ich verwenden
xx,yy,zz
wie die Variablennamen unten, um die Unterscheidung zu erleichtern.)Konvertieren Sie Ihre
X,Y
Koordinaten in dasx,y,z
Format:Führen Sie eine Drehung um 60 ° in die eine oder andere Richtung durch:
Konvertieren Sie den
x,y,z
Rücken zu IhremX,Y
:Wenn Sie beispielsweise mit (X = -2, Y = 1) beginnen und um 60 ° nach rechts drehen möchten, konvertieren Sie:
dann um
-2,1,1
60 ° nach rechts drehen mit:wie Sie hier sehen:
dann zurück konvertieren
-1,2,-1
:Also dreht sich (X = -2, Y = 1) um 60 ° nach rechts in (X = -2, Y = -1).
quelle
Definieren wir zunächst eine neue Nummer. Keine Sorge, es ist einfach.
Oder einfach ausgedrückt: f = √3 × i , wobei i die imaginäre Einheit ist . Damit entspricht eine Drehung um 60 Grad im Uhrzeigersinn der Multiplikation mit 1/2 × (1 - f ) und eine Drehung um 60 Grad gegen den Uhrzeigersinn der Multiplikation mit 1/2 × (1 + f ) . Wenn dies seltsam klingt, denken Sie daran, dass die Multiplikation mit einer komplexen Zahl der Drehung in der 2D-Ebene entspricht. Wir "quetschen" nur die komplexen Zahlen in der imaginären Richtung ein wenig (um √3), um uns nicht mit Quadratwurzeln oder Nicht-Ganzzahlen befassen zu müssen.
Wir können den Punkt (a, b) auch als a + b × f schreiben .
Dadurch können wir jeden Punkt in der Ebene drehen. Zum Beispiel dreht sich der Punkt (2,0) = 2 + 0 × f zu (1, -1), dann zu (-1, -1), (-2,0), (-1,1), ( 1,1) und schließlich zurück zu (2,0), einfach durch Multiplikation.
Natürlich brauchen wir eine Möglichkeit, diese Punkte von unseren Koordinaten in diejenigen zu übersetzen, in denen wir die Rotationen durchführen, und dann wieder zurück. Dazu wird eine weitere Information benötigt: Wenn der Punkt, um den wir die Drehung durchführen, links oder rechts von der vertikalen Linie liegt. Der Einfachheit halber erklären wir, dass es einen "Wobble" -Wert w von 0 hat, wenn es links davon ist (wie der Mittelpunkt der Drehung [0,0] in Ihren unteren beiden Bildern), und von 1, wenn es rechts davon ist davon. Dies erweitert unsere ursprünglichen Punkte auf dreidimensional; ( x , y , w ), wobei "w" nach der Normalisierung entweder 0 oder 1 ist. Die Normalisierungsfunktion ist:
NORM: ( x , y , w ) -> ( x + Etage ( w / 2), y , w mod 2), wobei die "mod" -Operation so definiert ist, dass nur positive Werte oder Null zurückgegeben werden.
Unser Algorithmus sieht nun wie folgt aus:
Transformieren Sie unsere Punkte ( a , b , c ) in ihre Positionen relativ zum Rotationszentrum ( x , y , w ), indem Sie ( a - x , b - y , c - w ) berechnen und dann das Ergebnis normalisieren. Dies setzt das Rotationszentrum offensichtlich auf (0,0,0).
Transformieren Sie unsere Punkte von ihren "nativen" Koordinaten in die komplexen Rotationskoordinaten: ( a , b , c ) -> (2 × a + c , b ) = 2 × a + c + b × f
Drehen Sie unsere Punkte, indem Sie sie nach Bedarf mit einer der oben genannten Rotationszahlen multiplizieren.
Ra-transformiere die Punkte von den Rotationskoordinaten zurück zu ihren "nativen": ( r , s ) -> (Boden ( r / 2), s , r mod 2), wobei "mod" wie oben definiert ist.
Transformieren Sie die Punkte wieder in ihre ursprüngliche Position, indem Sie sie zum Rotationszentrum ( x , y , z ) hinzufügen und normalisieren.
Eine einfache Version unserer "Triplex" -Nummern, die auf f in C ++ basieren, würde folgendermaßen aussehen:
quelle