2009-05-21 17 views

Respuesta

8

Suponiendo que la transformada SOLO contiene una rotación que es fácil: simplemente toma el elemento acos del m11.

Todavía funciona si la transformación contiene una traducción, pero si contiene esquila o escala, no tiene suerte. Estos pueden reconstruirse descomponiendo la matriz en una matriz de cizalla, escala y rotación, pero los resultados que obtienes no son lo que estás buscando.

+0

+1 por la precisión técnica. La descomposición SVD de la parte no traducida también viene a la mente (composición de rotación, escalado anisotrópico a lo largo de los ejes x-y, y rotación)) –

8

La forma más sencilla en general es transformar (0,0) y (1,0), a continuación, utilizar las funciones trigonométricas (arctan) para obtener el ángulo

+0

Esta es la forma correcta de hacerlo. gracias – sharvey

4

La Matriz de Transformación es una implementación utilizada para gráficos 3D. Simplifica la matemática para acelerar las orientaciones posicionales/rotacionales en 3D de puntos/objetos. De hecho, es muy difícil extraer la orientación de la Transformación debido a la forma en que acumula sucesivas traducciones/rotaciones/escalas.

Aquí hay una sugerencia. Tome un vector que apunta en una dirección simple como (1,0,0), y luego aplique la Transformación a él. Su vector resultante será traducido y rotado para darle algo como esto: (27.8, 19.2, 77.4). Aplica la Transformación a (0,0,0), para obtener algo como (26.1, 19.4, 50.8). Puede usar estos dos puntos para calcular las rotaciones que se han aplicado en función de conocer sus puntos de inicio de (1,0,0).

¿Le sirve de ayuda?

+1

QTransform realiza transformaciones 2D utilizando matrices 3x3. Las transformaciones 3D con matrices 4x4 son muy similares, pero las matemáticas en el caso 2D son un poco más simples. Dicho esto, todos, excepto Nils, parecen haber olvidado las transformaciones de corte como [[1,1,0], [0,1,0], [0,0,1]], en cuyo caso solo presionar dos puntos no lo hará devolver un resultado suficientemente descriptivo. – ephemient

2

Generalmente necesita una función de trigonometría inversa, pero debe tener cuidado con las ambigüedades de cuadrante, y esto es lo que debe usar atan2 (a veces deletreado arctan2). Así que o bien gira un vector unitario [0, 1] a [x, y] y luego usa atan2 (y, x), o si la matriz solo está implementando una rotación, puedes usar atan2 (m12, m11). (Estas son similares a las respuestas de Javier y Nils, excepto que no usan atan2.)

1

Estaba usando QGraphicsItem con solo setRotate y no tenía ningún tipo de problema, hasta que agregué una funcionalidad de grupo rotar. El problema es que cuando se llama a destroyItemGroup, aplica la rotación como una transformación a los artículos, y no como una rotación. Por eso tuve que recuperar la rotación desde este objeto QTransform.

Mi solución fue añadir las siguientes líneas al método itemChange (crédito a la respuesta de tom10):

QVariant MyGraphicItem::itemChange(GraphicsItemChange change, const QVariant &value) 
{ 
    if(change == ItemTransformChange) 
    { 
     auto transform = value.value<QTransform>(); 
     setRotation(rotation() + qRadiansToDegrees(qAtan2(transform.m12(), transform.m11()))); 
     return QVariant(); 
    } 
    ... 
} 

PS .: La otra solución con acos y M11() no funcionaba. Se bloquea para ciertos valores, como se explica en tom10.

Cuestiones relacionadas