2010-12-05 25 views
21

¿cómo puedo extraer los valores de rotación, escala y traslación de la matriz de transformación 2d? Me refiero a una tienen una transformación 2dextracto de rotación, valores de escala de la matriz de transformación 2d

matrix = [1, 0, 0, 1, 0, 0] 

matrix.rotate(45/180 * PI) 
matrix.scale(3, 4) 
matrix.translate(50, 100) 
matrix.rotate(30/180 * PI) 
matrix.scale(-2, 4) 

ahora mi matriz tienen valores [a, b, c, d, tx, ty]

olvidemos sobre los procesos anteriores y imaginar que tenemos sólo los valores a, b, c, d, tx, ty

Cómo puedo encontrar los valores totales de rotación y escala a través de a, b, c, d, tx, ty

lo siento por mi inglés

Gracias a su avance

EDITAR

creo que debe haber una respuesta en alguna parte ...

he intentado en Flash Builder (AS3) como esto

var m:Matrix = new Matrix; 
    m.rotate(.25 * Math.PI); 
    m.scale(4, 5); 
    m.translate(100, 50); 
    m.rotate(.33 * Math.PI); 
    m.scale(-3, 2.5); 

    var shape:Shape = new Shape; 
    shape.transform.matrix = m; 

    trace(shape.x, shape.y, shape.scaleX, shape.scaleY, shape.rotation); 

y la salida es:

x = -23.6 
y = 278.8 
scaleX = 11.627334873920528 
scaleY = -13.54222263865791 
rotation = 65.56274134518259 (in degrees) 
+1

Esta pregunta sería la más adecuada para http://math.stackexchange.com/ - obtendrá una respuesta más rápida :-) – Bojangles

+1

acabo de hacer aquí: http://math.stackexchange.com/questions/13150/ extracting-rotation-scale-values-from-2d-transformation-matrix gracias –

+0

Danos un ejemplo de valores a, b, c, d, tx, ty veamos si alguna respuesta coincide con lo que esperas. – ja72

Respuesta

37

No todos los valores de a, b, c, d, tx, ty will y obtener una secuencia de rotación válida. Asumo los valores anteriores son parte de una matriz de rotación homogénea 3x3 en 2D

| a b tx | 
A = | c d ty | 
    | 0 0 1 | 

que transforma las coordenadas [x, y, 1] en:

[x', y', 1] = A * |x| 
        |y| 
        |z| 
  • Así establezca la traslación en [dx, dy]=[tx, ty]
  • La escala es sx = sqrt(a² + c²) y sy = sqrt(b² + d²)
  • El ángulo de rotación es t = atan(c/d) o t = atan(-b/a) como también deberían ser lo mismo.

De lo contrario, no tiene una matriz de rotación válida.


La transformación anterior se expande para:

x' = tx + sx (x Cos θ - y Sin θ) 
y' = ty + sy (x Sin θ + y Cos θ) 

cuando la orden es la rotación, seguido de escala y a continuación la traducción.

+0

La operación de escala puede ser diferente en cada dirección ... la escala es un vector ... –

+3

gracias por la rotación y la traducción ... sobre la escala, obtuvimos un único valor calculado para escalar (s = sqrt (b^2 + d^2)) ¿es posible encontrar los valores scaleX y scaleY? –

+0

Actualicé las matemáticas con 2d escalado. Me perdí eso en la publicación original (mi mala). – ja72

4

Si en la escala hubiera escalado la misma cantidad en x y en y, entonces el determinante de la matriz, es decir, ad-bc, que le dice que el multiplicador de área también le indicará el cambio lineal de escala: sería la raíz cuadrada del determinante. atan (b/a) o mejor atan2 (b, a) le diría el ángulo total por el que ha girado.

Sin embargo, como su escalamiento no es uniforme, generalmente no habrá una manera de condensar su serie de rotaciones y escalas a una sola rotación, seguido de una escala no uniforme en xey.

5

Me encontré con este problema hoy y encontré la solución más fácil para transformar un punto usando la matriz. De esta forma, puede extraer la traducción primero, luego la rotación y la escala.

Esto solo funciona si x e y siempre tienen la misma escala (escala uniforme).

Dada su matriz M que ha sufrido una serie de transformaciones,

var translate:Point; 
var rotate:Number; 
var scale:Number; 

// extract translation 
var p:Point = new Point(); 
translate = m.transformPoint(p); 
m.translate(-translate.x, -translate.y); 

// extract (uniform) scale 
p.x = 1.0; 
p.y = 0.0; 
p = m.transformPoint(p); 
scale = p.length; 

// and rotation 
rotate = Math.atan2(p.y, p.x); 

hay que ir!

Cuestiones relacionadas