PDA

Ver la versión completa : Ayuda con matrices



efegea
26/05/2009, 18:24
Pongamos que tengo dos puntos 2D, en distintas coordenadas.

http://img5.imageshack.us/img5/1831/matrizdospuntos01.png

Pongamos que dibujo una imagen a partir de la coordenada del punto (a).

http://img5.imageshack.us/img5/9232/matrizdospuntos02.png

¿es posible obtener a partir de alguna fórmula la matriz que se le ha de aplicar a la imagen para que rote y escale para situarse de la siguiente forma?

http://img5.imageshack.us/img5/5079/matrizdospuntos03.png

Aunque en realidad, los puntos no estarían en las esquinas de las imágenes, sino en puntos arbitrarios ya definidos cuando se calcula la matriz.

chemaris
26/05/2009, 18:34
uff posible es, lamentablemente aqui no tengo los apuntes de grafica y no me acuerdo muy bien que matriz se ha de aplicar

Soltfern
26/05/2009, 18:39
http://img20.imageshack.us/img20/8817/63141049.jpg
Si conoces alpha (que deberías si sabes las posiciones de a y de b), la matriz de rotación en ese sentido creo que debería ser la impropia, es decir:

cos(alpha) -sin(alpha)

sin(alpha) cos(alpha)


Y fijando la posición de un punto de la imagen al que quieras, tendrías la imagen rotada con ese punto coincidiendo en el de tu elección (sobre redimensionar ni idea)

Molondro
26/05/2009, 18:42
si tumbas la fuente se saldrá toda el agua... siento no poder ser de más ayuda.

DarkDijkstra
26/05/2009, 18:43
Pues así en frío, tendrías que calcular el ángulo de rotación (con la arcotangente del incremento de "y" partido del incremento de "x") por un lado y el factor de escala (la distancia entre los puntos "a" y "b" partido de la altura original).
(Llamemos A al ángulo y S a la escala)

Luego podrías usar una matriz de escalado (M1):
S 0 0
0 S 0
0 0 1

Una de traslación al origen de coordenadas (M2, con "x" e "y" las coordenadas originales):
1 0 0
0 1 0
-x -y 1

Luego una de rotación (M3):
cos(A) sin(A) 0
-sin(A) cos(A) 0
0 0 1

Y una de traslación para llevar la figura a su nuevo sitio (M4, con "x" e "y" las nuevas coords):
1 0 0
0 1 0
x y 1

Total, con M1*M2*M3*M4 estaría (salvo que me esté patinando a lo grande)

No sé si te vale (o si ya sabías eso y lo que querías era hacerlo con una sola... en ese caso ni idea ; )

efegea
26/05/2009, 18:49
http://img20.imageshack.us/img20/8817/63141049.jpg
Si conoces alpha (que deberías si sabes las posiciones de a y de b), la matriz de rotación en ese sentido creo que debería ser la impropia, es decir:

cos(alpha) -sin(alpha)

sin(alpha) cos(alpha)


Y fijando la posición de un punto de la imagen al que quieras, tendrías la imagen rotada con ese punto coincidiendo en el de tu elección (sobre redimensionar ni idea)

Gracias, no parece tan complicado.

Para redimensionar, creo que sería calculando la distancia entre a y b y escalando la imagen de modo que la altura sea esa distancia.


si tumbas la fuente se saldrá toda el agua... siento no poder ser de más ayuda.

:D

< - >

Pues así en frío, tendrías que calcular el ángulo de rotación (con la arcotangente del incremento de "y" partido del incremento de "x") por un lado y el factor de escala (la distancia entre los puntos "a" y "b" partido de la altura original).
(Llamemos A al ángulo y S a la escala)

Luego podrías usar una matriz de escalado (M1):
S 0 0
0 S 0
0 0 1

Una de traslación al origen de coordenadas (M2, con "x" e "y" las coordenadas originales):
1 0 0
0 1 0
-x -y 1

Luego una de rotación (M3):
cos(A) sin(A) 0
-sin(A) cos(A) 0
0 0 1

Y una de traslación para llevar la figura a su nuevo sitio (M4, con "x" e "y" las nuevas coords):
1 0 0
0 1 0
x y 1

Total, con M1*M2*M3*M4 estaría (salvo que me esté patinando a lo grande)

No sé si te vale (o si ya sabías eso y lo que querías era hacerlo con una sola... en ese caso ni idea ; )

Vale, te has adelantado o yo posteo demasiado lento :D Gracias, también me sirve de ayuda :)

Soltfern
26/05/2009, 18:49
Gracias, no parece tan complicado.

Para redimensionar, creo que sería calculando la distancia entre a y b y escalando la imagen de modo que la altura sea esa distancia.



:D

< - >


Vale, te has adelantado o yo posteo demasiado lento :D Gracias, también me sirve de ayuda :)
Debería ser así, como bien dijo Dark

EDIT: Las matrices de rotación que hemos puesto Dark y yo tienen los senos cambiados de signo, y no se cual de las 2 está bien. El caso es que la suya es una rotación propia (que si no recuerdo mal es en sentido natural, es decir, contrario a las agujas del reloj) y la mia una impropia (en el sentido de las agujas del reloj). No sabría decirte cual usar porque nunca he usado matrices para girar puertas xD

DarkDijkstra
26/05/2009, 18:55
El caso es que la suya es una rotación propia (que si no recuerdo mal es en sentido natural, es decir, contrario a las agujas del reloj) y la mia una impropia (en el sentido de las agujas del reloj). No sabría decirte cual usar porque nunca he usado matrices para girar puertas xD

Me estás recordando a la típica charla que tengo con los amigos cada vez que jugamos a algún juego de mesa / cartas... "vamos 'clockwais' o 'counter-clockwais'" XD

Soltfern
26/05/2009, 19:00
Me estás recordando a la típica charla que tengo con los amigos cada vez que jugamos a algún juego de mesa / cartas... "vamos 'clockwais' o 'counter-clockwais'" XD
:quepalmo::quepalmo::quepalmo: