Wie kann ich konvertieren Koordinaten auf einem Platz auf einem Kreis koordiniert?
-
06-07-2019 - |
Frage
Ich entwickle ein Indie-Videospiel, und habe unter der Annahme, dass in Betrieb, weil der thumbstick auf meinem Controller einen kreisförmigen Bewegungsbereich hat, gibt sie „circular“ koordiniert; das heißt, Koordinaten kartesische in einem kreisförmigen Bereich (mit dem Radius 1) eingeschränkt. In der Tat sind die Koordinaten „square“; beispielsweise die rechte obere Position thumbstick Register als x = 1, y = 1 ist. Wenn ich die Koordinaten von kartesischen in polare wandeln, kann die Größe überschreiten 1 -., Die bewirkt, dass der Spieler schneller diagonal bewegen können, als sie kann vertikal oder horizontal
Also, um zu klären, ich die Position eines analogen thumbstick in Bezug auf eine Richtung und Größe aufnehmen wollen, wo der Betrag zwischen 0 und 1. Die thumbstick kehrt Koordinaten auf einer quadratischen Ebene ist, so einfach Umwandeln der Koordinaten von kartesisch zu polar ist nicht ausreichend. Ich glaube, ich brauche die Koordinate Raum zu konvertieren, aber das ist es, die Grenzen meines Affenhirns drücken.
Lösung
Siehe Zuordnen eines Quadrat zu einem Kreis . Es gibt auch eine schöne Visualisierung für die Abbildung. Sie erhalten:
xCircle = xSquare * sqrt(1 - 0.5*ySquare^2)
yCircle = ySquare * sqrt(1 - 0.5*xSquare^2)
Andere Tipps
Die Abbildung ist nicht eindeutig. Es gibt viele andere Lösungen für diese Frage.
Zum Beispiel dieser Zuordnung wird auch funktionieren
u = x √ (x² + y² - x²y²) / √ (x² + y²)
v = y √ (x² + y² - x²y²) / √ (x² + y²)
, wobei (u, v) sind kreisförmige Scheibe Koordinaten und (x, y) sind quadratisch Koordinaten.
Ein Bild sagt mehr als tausend Worte, so sind hier einige Bilder, die die Nicht-Eindeutigkeit der Zuordnung und seine Umkehrung zu illustrieren.
For a C++ implementation
dieses anderen Mapping, gehen Sie zu
http://squircular.blogspot.com/2015/09/fg-squircle -mapping.html
Siehe http://squircular.blogspot.com für mehr Bilder von Kartierungsergebnissen.
Siehe auch „Analytische Methoden für die Disc quadriert“ für ein Papier verschiedene Mapping-Gleichungen mit Beweisen zu diskutieren und Ableitungen.
Dividieren jeden Wert durch den Betrag alle Werte auf einen Einheitsvektor zu normalisieren, z.
magn = sqrt(x * x + y * y);
newx = magn > 1.0 ? x / magn : x;
newy = magn > 1.0 ? y / magn : y;
Dies kann jedoch zur Folge haben, die Größe Clipping stattdessen für die inneren Werte der Normalisierung .. Das heißt, werden Sie den gleichen Wert für einen Regler geschoben „voll“ in der oberen linken und einem Controller erhalten fast gedrückt vollständig in die gleiche Richtung.