Come faccio a convertire tra due diversi sistemi di coordinate 2D?


10

Sto cercando di convertire una coordinata da un sistema di coordinate a un altro, in modo da poterlo disegnare su un'immagine.

Fondamentalmente il sistema di coordinate di destinazione è il seguente:

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

(solo un'immagine standard su cui sto disegnando con le dimensioni di 1066 x 1600)

La posizione che sto cercando di disegnare sull'immagine ha effettivamente le stesse dimensioni esatte, ma il sistema di coordinate è diverso. L'intervallo di tutte le coordinate è 1066x1600.

Ma un esempio di coordinate sarebbe:

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

La gamma di questo sistema di coordinate è:

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

Sento che questa è Matematica MOLTO semplice, ma per qualche ragione non la capisco.

Come posso convertire le coordinate fornite nel primo sistema di coordinate?


3
Se i due sistemi di coordinate hanno gli stessi vettori di base, è possibile utilizzare semplicemente un fattore di ridimensionamento. Se non hanno gli stessi vettori di base è necessario un cambio di base .
Thalador,

Risposte:


7

Puoi normalizzare il primo valore, questo ti darà un valore nell'intervallo [0,1]. Puoi considerarlo come percentuale X, la percentuale a cui il valore è mappato tra i valori minimo e massimo. Quindi puoi scoprire dove appartiene quella percentuale nel tuo sistema di coordinate di destinazione vedendo quale valore è la percentuale X attraverso il sistema di destinazione. Userò il codice Java come linguaggio di esempio, sono sicuro che i concetti sono abbastanza chiari da tradurre in qualsiasi lingua.

Quindi normalizza:

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

Usando il tuo esempio avresti inserito:

xPercent = normalize(x,0,1066);

Quindi trova dove si trova nel sistema di destinazione. Con qualcosa del genere

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

O per usare i tuoi valori:

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

Quindi, ad esempio, con un valore x di 1000, dovresti mapparlo sul tuo sistema di coordinate di destinazione 467.29.

In alternativa , se i sistemi di coordinate saranno sempre gli stessi, è possibile pre-calcolare il rapporto tra loro.

Così:

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

destX = x*xRatio+destMin;

Perché Java (C #)? Non ha chiesto il codice Java :)
kravemir,

6
È per fare un esempio. Non ha bisogno di essere usato così com'è e il concetto è abbastanza chiaro.
MichaelHouse

Ma se lo faccio: destX = xPercent * (Math.abs (533.33--533.33)) + -533.33; Ottengo sempre un valore negativo e il sistema di coordinate del risultato è solo da 0 a 1066, dovrei cambiare tutte le coordinate?
Geesu,

Li ho scambiati e sto ancora ricevendo dump.tanaris4.com/sota.png proprio come in un altro post, forse sto avendo un altro problema (legato a C # e al disegno). Grazie ragazzi!
Geesu,

Capito, per qualche motivo ho dovuto fare xPercent = 1.0f - xPercent
Geesu il

4

È semplice matematica:

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

src - sistema di coordinate di origine

sistema di coordinamento dei risultati

Modifica - spiegazione della matematica

( src - src_min ) / ( src_max - src_min )lo traduce in un sistema di coordinate a partire da zero con uguale lunghezza del sistema di coordinate di origine (0.0, src_max - src_min ). Quindi ridimensiona il valore per coordinare il sistema (0.0, 1.0).

* ( res_max - res_min ) questo scala il valore per coordinare il sistema a partire da zero con la lunghezza del sistema di coordinamento dei risultati (0.0, dst_max - dst_min)

+ res_min traduce il valore nel sistema di coordinate del risultato (dst_min, dst_max)


Ho pensato anche questo, ma non viene visualizzato correttamente: dump.tanaris4.com/sota.png La coordinata finale dovrebbe colpire dove si trova il cerchio bianco in basso
Geesu,

1
Questo non spiega affatto la matematica, perché no? :)
MichaelHouse

@ Byte56 Per me è una formula sufficiente per capire qualcosa, specialmente se utilizza solo operazioni aritmetiche, ma ho aggiunto una spiegazione per le persone che ne avrebbero bisogno :)
kravemir,

1
@Geesu Quindi probabilmente stai facendo qualcos'altro (rendering matrici?).
kravemir,

2
Grazie per averlo aggiornato. In genere penso sia meglio dare una risposta che cerchi di spiegare il perché. Altrimenti stai solo dando la risposta a questa domanda, invece di come risolvere questa domanda e problemi simili. È una cosa tipo "dai a un pesce un uomo, insegna a un uomo a pescare".
MichaelHouse

3

L'equazione di base per la trasformazione di coordinate 2D (in algebra, senza rotazione) è:

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

dati due punti in TargetCoordinate (T1, T2) che corrispondono a due punti in SourceCoordinate (S1, S2) TranslateFactore ScalingFactorvengono dati risolvendo:

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

quale risultato:

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

Nel tuo caso, per la coordinata x

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

E quindi,

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

Le coordinate y seguono la stessa procedura


S1 e S2 non possono avere la stessa coordinata x / y che porta a una divisione per zero.
zwcloud,

0

Fare alcune ipotesi:

  • Sei (eventualmente) interessato a un'impementazione di matrice, per praticità e potenza; e
  • Hai familiarità con coordinate omogenee.

Quindi la domanda passa a: Qual è la matrice di trasformazione omogenea per il mio cambiamento di base?

Per rispondere a questa domanda abbiamo prima bisogno delle risposte a tre domande sussidiarie:

  1. Dove si è trasferita la mia origine?
  2. Che cosa è successo al mio asse X? Sia (M11, M12) le coordinate del punto
  3. Che cosa è successo al mio asse Y?

Definire le risposte a queste tre domande come segue:

  1. (M31, M32) sono le coordinate della nuova origine nel sistema di coordinate originale.
  2. (M11, M12) sono le coordinate del nuovo vettore x unità nel sistema di coordinate originale.
  3. (M21, M22) sono le coordinate del nuovo vettore y unità nel sistema di coordinate originale.

Quindi la matrice di trasformazione omogenea è:

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

La mia convenzione qui è che i punti sono rappresentati da vettori di riga, che è la normale convenzione di computer grafica; i matematici e i fisici usano spesso l'opposto.


Un sistema di coordinate può essere descritto da una tale matrice: M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = origin.X, M32 = origin.Y. Data una matrice del sistema di coordinate A e una matrice del sistema di coordinate B, P * A * Inverso (B), dove P è la rappresentazione di un punto come coordinate in A, produce la rappresentazione del punto come coordinate in B.
Jim Balter
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.