Für mein Spiel brauche ich Funktionen, um zwischen zwei Koordinatensystemen zu übersetzen. Nun, es ist vor allem Mathe Frage, aber was ich brauche, ist der C ++ Code, um es zu tun und ein bisschen Erklärung, wie man mein Problem löst.
Bildschirmkoordinaten:
a) Die obere linke Ecke ist 0,0
b) keine Minuswerte
c) rechts + = x (je mehr x ist, desto mehr rechts ist der Punkt)
d) unten + = y
Kartesische 2D-Koordinaten:
a) Mittelpunkt ist (0, 0)
b) Minuswerte existieren
c) rechts + = x
d) bottom - = y (je weniger y ist, desto mehr ist unten Punkt)
Ich brauche einen einfachen Weg, um von einem System in ein anderes zu übersetzen und umgekehrt. Um das zu tun (ich denke), brauche ich ein wenig Wissen, wo die (0, 0) [obere linke Ecke in Bildschirmkoordinaten] in den kartesischen Koordinaten liegt.
Es gibt jedoch ein Problem, dass die Position in Bildschirmkoordinaten für einige Punkte in kartesischen Koordinaten nach dem Übersetzen in Bildschirm-Koordinaten minus sein kann, was ein Unsinn ist. Ich kann die obere linke Ecke der Bildschirmkoordinaten nicht in kartesische Koordinaten einfügen (-inifity, + unendlich) ...
Wie kann ich das lösen? Die einzige Lösung, die ich mir vorstellen kann, ist, den Bildschirm (0, 0) in kartesisches (0, 0) zu setzen und nur das IV-Viertel des kartesischen Systems zu verwenden, aber in diesem Fall ist das kartesische System nutzlos ...
Ich bin mir sicher, dass es Möglichkeiten gibt, Bildschirmkoordinaten in kartesische Koordinaten zu übersetzen und umgekehrt, aber ich mache etwas falsches mit diesen Minuswerten.
Der grundlegende Algorithmus zum Übersetzen von kartesischen Koordinaten in Bildschirmkoordinaten ist
%Vor%Aber wie Sie erwähnt haben, ist der kartesische Raum unendlich und Ihr Bildschirm nicht. Dies kann leicht gelöst werden, indem die Auflösung zwischen Bildschirm- und kartesischem Raum geändert wird. Der obige Algorithmus macht 1 Einheit im kartesischen Raum = 1 Einheit / Pixel im Bildschirmbereich. Wenn Sie andere Verhältnisse zulassen, können Sie "verkleinern" oder in Ihrem Bildschirmbereich den gesamten kartesischen Platz abdecken.
Dies würde den obigen Algorithmus in
ändern %Vor%Sie bearbeiten jetzt negative (oder zu große) screenX und screenY, indem Sie Ihren Zoomfaktor ändern, bis alle kartesischen Koordinaten auf den Bildschirm passen.
Sie können auch das Schwenken des Koordinatenraums zulassen, was bedeutet, dass die Mitte des kartesischen Raums außerhalb der Mitte des Bildschirms liegt. Dies könnte auch dazu beitragen, dass Ihr zoom_factor so eng wie möglich bleibt, aber auch Daten anpassen, die nicht gleichmäßig um den Ursprung des kartesischen Raums verteilt sind.
Dies würde den Algorithmus in
ändern %Vor%Für mein Spiel brauche ich Funktionen, um zwischen zwei Koordinatensystemen zu übersetzen. Nun, es ist vor allem Mathe Frage, aber was ich brauche, ist der C ++ Code, um es zu tun und ein bisschen Erklärung, wie man mein Problem löst.
Bildschirmkoordinaten:
a) Die obere linke Ecke ist 0,0
b) keine Minuswerte
c) rechts + = x (je mehr x ist, desto mehr rechts ist der Punkt)
d) unten + = y
Kartesische 2D-Koordinaten:
a) Mittelpunkt ist (0, 0)
b) Minuswerte existieren
c) rechts + = x
d) bottom - = y (je weniger y ist, desto mehr ist unten Punkt)
Ich brauche einen einfachen Weg, um von einem System in ein anderes zu übersetzen und umgekehrt. Um das zu tun (ich denke), brauche ich ein wenig Wissen, wo die (0, 0) [obere linke Ecke in Bildschirmkoordinaten] in den kartesischen Koordinaten liegt.
Es gibt jedoch ein Problem, dass die Position in Bildschirmkoordinaten für einige Punkte in kartesischen Koordinaten nach dem Übersetzen in Bildschirm-Koordinaten minus sein kann, was ein Unsinn ist. Ich kann die obere linke Ecke der Bildschirmkoordinaten nicht in kartesische Koordinaten einfügen (-inifity, + unendlich) ...
Wie kann ich das lösen? Die einzige Lösung, die ich mir vorstellen kann, ist, den Bildschirm (0, 0) in kartesisches (0, 0) zu setzen und nur das IV-Viertel des kartesischen Systems zu verwenden, aber in diesem Fall ist das kartesische System nutzlos ...
Ich bin mir sicher, dass es Möglichkeiten gibt, Bildschirmkoordinaten in kartesische Koordinaten zu übersetzen und umgekehrt, aber ich mache etwas falsches mit diesen Minuswerten.
Der grundlegende Algorithmus zum Übersetzen von kartesischen Koordinaten in Bildschirmkoordinaten ist
%Vor%Aber wie Sie erwähnt haben, ist der kartesische Raum unendlich und Ihr Bildschirm nicht. Dies kann leicht gelöst werden, indem die Auflösung zwischen Bildschirm- und kartesischem Raum geändert wird. Der obige Algorithmus macht 1 Einheit im kartesischen Raum = 1 Einheit / Pixel im Bildschirmbereich. Wenn Sie andere Verhältnisse zulassen, können Sie "verkleinern" oder in Ihrem Bildschirmbereich den gesamten kartesischen Platz abdecken.
Dies würde den obigen Algorithmus in
ändern %Vor%Sie bearbeiten jetzt negative (oder zu große) screenX und screenY, indem Sie Ihren Zoomfaktor ändern, bis alle kartesischen Koordinaten auf den Bildschirm passen.
Sie können auch das Schwenken des Koordinatenraums zulassen, was bedeutet, dass die Mitte des kartesischen Raums außerhalb der Mitte des Bildschirms liegt. Dies könnte auch dazu beitragen, dass Ihr zoom_factor so eng wie möglich bleibt, aber auch Daten anpassen, die nicht gleichmäßig um den Ursprung des kartesischen Raums verteilt sind.
Dies würde den Algorithmus in
ändern %Vor%Sie werden immer das Problem haben, dass das Ergebnis außerhalb des Bildschirms liegen könnte - entweder als ein negativer Wert oder als ein Wert, der größer als die verfügbare Bildschirmgröße ist.
Manchmal ist das egal: Wenn Ihre grafische API beispielsweise negative Werte akzeptiert und Ihre Zeichnung für Sie schneidet. Manchmal ist es wichtig, und in diesen Fällen sollten Sie eine Funktion haben, die prüft, ob eine Reihe von Bildschirmkoordinaten auf dem Bildschirm angezeigt wird.
Sie könnten auch eigene Begrenzungsfunktionen schreiben, die versuchen, etwas Sinnvolles mit Koordinaten zu tun, die vom Bildschirm fallen (z. B. Abschneiden negativer Bildschirmkoordinaten auf 0 und Koordinaten, die zu groß für die maximale Bildschirmkoordinate sind). Denken Sie jedoch daran, dass "sinnvoll" davon abhängt, was Sie tun möchten. Es ist daher am besten, wenn Sie solche Funktionen erst dann definieren, wenn Sie sie wirklich benötigen.
In jedem Fall können Sie, wie andere Antworten angemerkt haben, zwischen den Koordinatensystemen wie folgt umwandeln:
%Vor%und
%Vor%Ich habe ein bisschen mehr c ++ für Sie, basierend auf Microsoft Artikel: Ссылка
Sie müssen nur zwei Bildschirmpunkte und zwei Punkte in Ihrem Koordinatensystem kennen. Dann können Sie Punkt von einem System in ein anderes konvertieren.
%Vor%Sie müssen die Breite und Höhe des Bildschirms kennen.
Dann können Sie tun:
%Vor%Und:
%Vor%Sie werden immer das Problem haben, dass das Ergebnis außerhalb des Bildschirms liegen könnte - entweder als ein negativer Wert oder als ein Wert, der größer als die verfügbare Bildschirmgröße ist.
Manchmal ist das egal: Wenn Ihre grafische API beispielsweise negative Werte akzeptiert und Ihre Zeichnung für Sie schneidet. Manchmal ist es wichtig, und in diesen Fällen sollten Sie eine Funktion haben, die prüft, ob eine Reihe von Bildschirmkoordinaten auf dem Bildschirm angezeigt wird.
Sie könnten auch eigene Begrenzungsfunktionen schreiben, die versuchen, etwas Sinnvolles mit Koordinaten zu tun, die vom Bildschirm fallen (z. B. Abschneiden negativer Bildschirmkoordinaten auf 0 und Koordinaten, die zu groß für die maximale Bildschirmkoordinate sind). Denken Sie jedoch daran, dass "sinnvoll" davon abhängt, was Sie tun möchten. Es ist daher am besten, wenn Sie solche Funktionen erst dann definieren, wenn Sie sie wirklich benötigen.
In jedem Fall können Sie, wie andere Antworten angemerkt haben, zwischen den Koordinatensystemen wie folgt umwandeln:
%Vor%und
%Vor%Ich habe ein bisschen mehr c ++ für Sie, basierend auf Microsoft Artikel: Ссылка
Sie müssen nur zwei Bildschirmpunkte und zwei Punkte in Ihrem Koordinatensystem kennen. Dann können Sie Punkt von einem System in ein anderes konvertieren.
%Vor%Tags und Links algorithm math c++ coordinates coordinate-systems