Wie konvertiere ich zwischen zwei verschiedenen 2D-Koordinatensystemen?

10

Ich versuche, eine Koordinate von einem Koordinatensystem in ein anderes zu konvertieren, damit ich sie auf ein Bild zeichnen kann.

Grundsätzlich lautet das Zielkoordinatensystem wie folgt:

X range: 0 to 1066
Y range: 0 to 1600

(Nur ein Standardbild mit einer Größe von 1066 x 1600)

Die Position, die ich auf das Bild zeichnen möchte, hat tatsächlich genau die gleiche Größe, aber das Koordinatensystem ist unterschiedlich. Die Spannweite aller Koordinaten beträgt 1066 x 1600.

Ein Koordinatenbeispiel wäre jedoch:

(111.33f, 1408.41f)
(-212.87f, 1225.16f)

Der Bereich dieses Koordinatensystems ist:

X range: -533.333 to 533.333
Y range: 533.333 to 2133.333

Ich denke, das ist SEHR einfache Mathematik, aber aus irgendeinem Grund verstehe ich es nicht.

Wie kann ich die angegebenen Koordinaten in das erste Koordinatensystem konvertieren?

Geesu
quelle
3
Wenn die beiden Koordinatensysteme dieselben Basisvektoren haben, können Sie einfach einen Skalierungsfaktor verwenden. Wenn sie nicht die gleichen Basisvektoren haben, ist eine Basisänderung erforderlich.
Thalador

Antworten:

7

Sie können den ersten Wert normalisieren. Dadurch erhalten Sie einen Wert im Bereich [0,1]. Sie können sich das als X-Prozentsatz vorstellen, den Prozentsatz, dem der Wert zwischen dem Minimal- und dem Maximalwert zugeordnet ist. Dann können Sie herausfinden, wo dieser Prozentsatz in Ihr Zielkoordinatensystem gehört, indem Sie im Zielsystem sehen, welcher Wert X Prozent ist. Ich werde Java-Code als Beispielsprache verwenden. Ich bin sicher, dass die Konzepte klar genug sind, um in jede Sprache übersetzt zu werden.

Also normalisieren:

public static float normalize(float value, float min, float max) {
    return Math.abs((value - min) / (max - min));
}

Anhand Ihres Beispiels würden Sie Folgendes eingeben:

xPercent = normalize(x,0,1066);

Finden Sie dann heraus, wo es im Zielsystem liegt. Mit so etwas wie

destX = xPercent*(Math.abs(max-min)) + min;

Oder um Ihre Werte zu verwenden:

destX = xPercent*(Math.abs(533.33--533.33)) + -533.33;

Mit einem x-Wert von 1000 würden Sie dies beispielsweise Ihrem Zielkoordinatensystem zuordnen 467.29.

Wenn die Koordinatensysteme immer gleich sind, können Sie alternativ das Verhältnis zwischen ihnen vorberechnen.

Damit:

xRatio = (Math.abs(srcMax-srcMin))/(Math.abs(destMax-destMin));

destX = x*xRatio+destMin;
MichaelHouse
quelle
Warum Java (C #)? Er hat nicht nach Java-Code
gefragt
6
Es ist ein Beispiel zu geben. Es muss nicht so verwendet werden, wie es ist, und das Konzept ist klar genug.
MichaelHouse
Aber wenn ich das mache: destX = xPercent * (Math.abs (533.33--533.33)) + -533.33; Ich bekomme immer einen negativen Wert und das Ergebniskoordinatensystem ist nur von 0-1066. Soll ich alle Koordinaten vertauschen?
Geesu
Ich habe sie vertauscht und bekomme immer noch dump.tanaris4.com/sota.png, genau wie in einem anderen Beitrag. Vielleicht habe ich insgesamt ein anderes Problem (im Zusammenhang mit C # und Zeichnen). Danke Leute!
Geesu
Verstanden, aus irgendeinem Grund musste ich xPercent = 1.0f - xPercent
Geesu
4

Es ist einfache Mathematik:

res = ( src - src_min ) / ( src_max - src_min ) * ( res_max - res_min ) + res_min

src - Quellkoordinatensystem

Res - Ergebniskoordinationssystem

Bearbeiten - Erklärung der Mathematik

( src - src_min ) / ( src_max - src_min )übersetzt es in ein Koordinatensystem, das bei Null mit der gleichen Länge des Quellkoordinatensystems beginnt (0.0, src_max - src_min ). Dann skaliert es den Wert zum Koordinatensystem (0.0, 1.0).

* ( res_max - res_min ) Dies skaliert den Wert für das Koordinatensystem beginnend bei Null mit der Länge des Ergebniskoordinationssystems (0.0, dst_max - dst_min)

+ res_min übersetzt den Wert in das Ergebniskoordinatensystem (dst_min, dst_max)

Kravemir
quelle
Ich dachte das auch, aber es wird nicht richtig angezeigt : dump.tanaris4.com/sota.png Die endgültige Koordinate sollte dort treffen, wo der weiße Kreis unten ist
Geesu
1
Das erklärt ihnen Mathe überhaupt nicht, warum nicht? :)
MichaelHouse
@ Byte56 Für mich ist Formel genug, um etwas zu verstehen, besonders wenn es nur arithmetische Operationen verwendet, aber ich habe Erklärungen für Leute hinzugefügt, die es brauchen würden :)
Kravemir
1
@Geesu Dann machst du wahrscheinlich noch etwas schlechtes (Rendering von Matrizen?).
Kravemir
2
Vielen Dank für die Aktualisierung. Ich denke im Allgemeinen, dass es besser ist, eine Antwort zu geben, die versucht, das Warum zu erklären. Andernfalls geben Sie nur die Antwort auf diese Frage, anstatt diese Frage und ähnliche Probleme zu lösen . Es ist eine Sache vom Typ "Gib einem Mann einen Fisch, bring einem Mann das Fischen bei".
MichaelHouse
3

Die Grundgleichung für die 2D-Koordinatentransformation (in der Algebra ohne Rotation) lautet:

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

gegeben zwei Punkte in TargetCoordinate (T1, T2), die zwei Punkten in SourceCoordinate (S1, S2) entsprechen, TranslateFactorund ScalingFactorgegeben durch Lösen:

T1 = TranslateFactor + ScalingFactor*S1
T2 = TranslateFactor + ScalingFactor*S2

welches Ergebnis:

TranslateFactor = (T2*S1 - T1*S2) / (S1 - S2)
ScalingFactor   = (T2 - T1) / (S2 - S1)

In Ihrem Fall für die x-Koordinate

S1 = 0    -> T1 = -533.333
S2 = 1066 -> T2 = 53.333

Und somit,

TranslateFactor = -533.333
ScalingFactor   = 1.000625
=> TargetCoordinate = (-533.333) + (1.000625)*SourceCoordinate

y-Koordinaten folgen dem gleichen Verfahren

tkokasih
quelle
S1 und S2 können nicht dieselbe x / y-Koordinate haben, was zu einer Division durch Null führt.
Zwcloud
0

Einige Annahmen treffen:

  • Sie sind (irgendwann) an einer Matriximplementierung interessiert, um die Bequemlichkeit und Leistung zu verbessern. und
  • Sie kennen homogene Koordinaten.

Dann wandert die Frage zu: Was ist die homogene Transformationsmatrix für meine Basisänderung?

Um dies zu beantworten, benötigen wir zuerst die Antworten auf drei Nebenfragen:

  1. Wohin ist mein Ursprung gezogen?
  2. Was ist mit meiner X-Achse passiert? Sei (M11, M12) die Koordinate des Punktes
  3. Was ist mit meiner Y-Achse passiert?

Definieren Sie die Antworten auf diese drei Fragen wie folgt:

  1. (M31, M32) sind die Koordinaten des neuen Ursprungs unter dem ursprünglichen Koordinatensystem.
  2. (M11, M12) sind die Koordinaten des neuen Einheits-X-Vektors im ursprünglichen Koordinatensystem.
  3. (M21, M22) sind die Koordinaten des neuen Einheits-y-Vektors im ursprünglichen Koordinatensystem.

Dann ist die homogene Transformationsmatrix:

( M11, M12,  0 )
( M21, M22,  0 )
( M31, M32,  1 )

Meine Konvention hier ist, dass Punkte durch Zeilenvektoren dargestellt werden, was die normale Computergrafikkonvention ist; Die Mathematiker und Physiker verwenden oft das Gegenteil.

Pieter Geerkens
quelle
Ein Koordinatensystem kann durch eine solche Matrix beschrieben werden: M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = origin.X, M32 = origin.Y. Bei gegebener Koordinatensystemmatrix A und Koordinatensystemmatrix B ergibt P * A * Inverse (B), wobei P die Darstellung eines Punktes als Koordinaten in A ist, die Darstellung des Punktes als Koordinaten in B.
Jim Balter