¿Cómo convierto entre dos sistemas de coordenadas 2D diferentes?

10

Estoy tratando de convertir una coordenada de un sistema de coordenadas a otro, para poder dibujarla en una imagen.

Básicamente, el sistema de coordenadas de destino es el siguiente:

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

(solo una imagen estándar que estoy dibujando con el tamaño de 1066 x 1600)

La posición que estoy tratando de dibujar en la imagen en realidad tiene exactamente el mismo tamaño, pero el sistema de coordenadas es diferente. El alcance de todas las coordenadas es 1066x1600.

Pero un ejemplo de coordenadas sería:

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

El rango de este sistema de coordenadas es:

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

Siento que esto es matemática MUY simple, pero por alguna razón no lo entiendo.

¿Cómo puedo convertir las coordenadas proporcionadas en el primer sistema de coordenadas?

Geesu
fuente
3
Si los dos sistemas de coordenadas tienen los mismos vectores de base, simplemente puede usar un factor de escala. Si no tienen los mismos vectores de base, es necesario un cambio de base .
thalador

Respuestas:

7

Puede normalizar el primer valor, esto le dará un valor en el rango [0,1]. Puede pensar en eso como un porcentaje X, el porcentaje al que se asigna el valor entre los valores mínimo y máximo. Luego puede encontrar dónde pertenece ese porcentaje en su sistema de coordenadas de destino al ver qué valor es X porcentaje a través del sistema de destino. Usaré el código Java como lenguaje de ejemplo, estoy seguro de que los conceptos son lo suficientemente claros como para traducir a cualquier idioma.

Entonces normalizar:

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

Usando su ejemplo que ingresaría:

xPercent = normalize(x,0,1066);

Luego encuentre dónde se encuentra en el sistema de destino. Con algo como

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

O para usar sus valores:

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

Entonces, por ejemplo, con un valor de x de 1000, asignaría eso a su sistema de coordenadas de destino 467.29.

Alternativamente , si los sistemas de coordenadas siempre serán los mismos, puede calcular previamente la relación entre ellos.

Entonces:

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

destX = x*xRatio+destMin;
MichaelHouse
fuente
¿Por qué Java (C #)? No pidió el código Java :)
kravemir
66
Es para dar un ejemplo. No necesita ser usado como está, y el concepto es lo suficientemente claro.
MichaelHouse
Pero si hago esto: destX = xPercent * (Math.abs (533.33--533.33)) + -533.33; Siempre obtengo un valor negativo, y el sistema de coordenadas del resultado es solo de 0-1066, ¿debería cambiar todas las coordenadas?
Geesu
Los cambié y todavía obtengo dump.tanaris4.com/sota.png al igual que en otra publicación, tal vez tengo otro problema por completo (relacionado con C # y el dibujo). ¡Gracias chicos!
Geesu
Lo tengo, por alguna razón tuve que hacer xPercent = 1.0f - xPercent
Geesu
4

Es matemática simple:

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

src - sistema de coordenadas fuente

res - sistema de coordinación de resultados

Editar - explicación de las matemáticas

( src - src_min ) / ( src_max - src_min )lo traduce al sistema de coordenadas comenzando en cero con igual longitud del sistema de coordenadas de origen (0.0, src_max - src_min ). Luego escala el valor para coordinar el sistema (0.0, 1.0).

* ( res_max - res_min ) esto escala el valor para coordinar el sistema comenzando en cero con la longitud del sistema de coordinación de resultados (0.0, dst_max - dst_min)

+ res_min traduce el valor al sistema de coordenadas resultante (dst_min, dst_max)

Kravemir
fuente
También pensé esto, pero no se muestra correctamente: dump.tanaris4.com/sota.png La coordenada final debería golpear donde está el círculo blanco en la parte inferior
Geesu
1
Esto no explica en absoluto las matemáticas, ¿por qué no? :)
MichaelHouse
@ Byte56 Para mí es la fórmula suficiente para entender algo sobre todo si se utiliza sólo operaciones aritméticas, pero hemos añadido una explicación para las personas que necesitaría :)
kravemir
1
@ GeeSu Entonces probablemente estás haciendo algo más malo (¿renderizar matrices?).
kravemir
2
Gracias por actualizar eso. En general, creo que es mejor dar una respuesta que intente explicar por qué. De lo contrario, solo está dando la respuesta a esta pregunta, en lugar de cómo resolver esta pregunta y problemas similares. Es una cosa del tipo "dale a un hombre un pez, enséñale a un hombre a pescar".
MichaelHouse
3

La ecuación básica para la transformación de coordenadas 2D (en álgebra, sin rotación involucrada) es:

TargetCoordinate = TranslateFactor + ScalingFactor*SourceCoordinate

dados dos puntos en TargetCoordinate (T1, T2) que corresponde a dos puntos en SourceCoordinate (S1, S2), TranslateFactory ScalingFactorse da resolviendo:

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

cuyo resultado:

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

En su caso, para la coordenada x

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

Y por lo tanto,

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

coordenada y sigue el mismo procedimiento

tkokasih
fuente
S1 y S2 no pueden tener la misma coordenada x / y que conduce a una división por cero.
zwcloud
0

Haciendo algunas suposiciones:

  • Usted está (eventualmente) interesado en una impedancia matricial, por conveniencia y poder; y
  • Estás familiarizado con las coordenadas homogéneas.

Entonces la pregunta migra a: ¿Cuál es la matriz de transformación homogénea para mi cambio de base?

Para responder esto, primero necesitamos las respuestas a tres consultas subsidiarias:

  1. ¿A dónde se mudó mi origen?
  2. ¿Qué pasó con mi eje X? Sea (M11, M12) las coordenadas del punto.
  3. ¿Qué pasó con mi eje Y?

Defina las respuestas a estas tres preguntas de la siguiente manera:

  1. (M31, M32) son las coordenadas del nuevo origen bajo el sistema de coordenadas original.
  2. (M11, M12) son las coordenadas de la nueva unidad x-vector en el sistema de coordenadas original.
  3. (M21, M22) son las coordenadas de la nueva unidad y-vector en el sistema de coordenadas original.

Entonces la matriz de transformación homogénea es:

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

Mi convención aquí es que los puntos están representados por vectores de fila, que es la convención gráfica de computadora normal; Los matemáticos y físicos a menudo usan el oppsoite.

Pieter Geerkens
fuente
Una matriz de este tipo puede describir un sistema de coordenadas: M11 = Xaxis.X, M12 = Xaxis.Y, M21 = Yaxis.X, M22 = Yaxis.Y, M31 = origin.X, M32 = origin.Y. Dada una matriz de sistema de coordenadas A y una matriz de sistema de coordenadas B, P * A * Inversa (B), donde P es la representación de un punto como coordenadas en A, produce la representación del punto como coordenadas en B.
Jim Balter