Übersetzung zwischen kartesischen und Bildschirmkoordinaten

8

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.

    
user1873947 14.02.2013, 17:28
quelle

5 Antworten

11

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%     
MerickOWA 14.02.2013, 17:40
quelle
2
___ qstntxt ___

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.

    
___ answer14880815 ___

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%     
___ answer14880772 ___

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%     
___ tag123c ___ C ++ ist eine universelle Programmiersprache. Es wurde ursprünglich als Erweiterung von C entworfen und behält eine ähnliche Syntax, ist aber jetzt eine komplett andere Sprache. Verwenden Sie dieses Tag für Fragen zu Code, der mit einem C ++ - Compiler kompiliert werden soll. ___ tag123algorithm ___ Ein Algorithmus ist eine Folge wohldefinierter Schritte, die eine abstrakte Lösung für ein Problem definieren. Verwenden Sie dieses Tag, wenn sich Ihr Problem auf den Algorithmusentwurf bezieht. ___ tag123math ___ Mathematik ist das Studium von Quantität, Struktur, Raum und Veränderung. Alle mathematischen Fragen auf dieser Website sollten programmbezogen sein. ___ answer42643892 ___

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%     
___ tag123koordinaten ___ Bezieht sich auf eine Zahlenfolge, die die Position eines Objekts relativ zu einer Achse angibt. Gemeinhin bezieht sich auf ein Breiten- / Längenpaar, das eine geografische Position angibt. ___ tag123Koordinatensysteme ___ Koordinatensysteme verwenden eine oder mehrere Zahlen oder Koordinaten, um die Position eines Punkts oder einer Geometrie im Raum eindeutig zu bestimmen. ___ answer14880680 ___

Sie müssen die Breite und Höhe des Bildschirms kennen.

Dann können Sie tun:

%Vor%

Und:

%Vor%     
___ qstnhdr ___ Übersetzung zwischen kartesischen und Bildschirmkoordinaten ___
sgonzalez 14.02.2013 17:33
quelle
1

Sie müssen die Breite und Höhe des Bildschirms kennen.

Dann können Sie tun:

%Vor%

Und:

%Vor%     
Virtlink 14.02.2013 17:33
quelle
1

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%     
comingstorm 14.02.2013 17:38
quelle
0

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%     
Serov Danil 07.03.2017 08:53
quelle