2010-07-08 24 views
6

estoy teniendo problemas para la elaboración de los valores devueltos del código de abajo pMeasure = PathMeasure, m = Matrix, distCount es la distancia a lo largo de la trayectoriaAndroid Matrix, ¿qué devuelve getValues ​​()?

pMeasure.getMatrix(distCount, m, 0x01 | 0x02); 
m.getValues(float[] values) 

flotador [2] & flotador [5] son ​​la posición x & y, pero no puedo entender el resto

cualquier ayuda una vez más, apreciada.

Respuesta

12

Tomado del Matrix class documentation:

última int MPERSP_0
Valor Constante public static: 6 (0x00000006)

última int MPERSP_1
Valor Constante public static: 7 (0x00000007)

public static final int MPERSP_2
Valor constante: 8 (0x00000008)

pública final int MSCALE_X
Valor Constante estática: 0 (0x00000000)

público static final int MSCALE_Y
Constante Valor: 4 (0x00000004)

público static final int MSKEW_X
Constante Valor: 1 (0x00000001)

público static final int MSKEW_Y
constante Valor: 3 (0x00000003)

int MTRANS_X
Valor Constante public static final: 2 (0x00000002)

público static final int MTRANS_Y
Constante Valor: 5 (0x00000005)

+0

Gracias, pero ¿qué significa la perspectiva en este sentido? – Matt

+3

Honesly, no sé. Apuesto a que estos valores son reservados, y la razón por la que están presentes tal vez es completar la matriz. Aquí encontrará más información sobre este tema: http://mobiledevelop.blogspot.com/2009/02/android-canvas-translation-discussion.html –

+2

Android usa skia y revisé el código fuente de la clase matrix de androides, en su C++ core, simplemente pega a Matrix, con SkMatrix. La matriz es 3x3 fila principal. Debido a esto MSCALE_X/Y no es realmente escala. Siempre que no haya rotaciones, es escala. Si la matriz codifica una rotación, necesita hacer cálculos adicionales para calcular la escala. MPERSP se usa para calcular la coordenada "z", por defecto z = 1. Si z! = 1 entonces x = x/z; y = y/z; z = z/z = 1. En general, no necesita preocuparse por eso z. Es como OpenGL 4x4 para 3D, excepto en Android es 3x3 para 2D –

6

Matrix Android utiliza skia y su fila-mayor es decir, los índices son los siguientes

0 1 2 
3 4 5 
6 7 8 

contrasto OpenGL utiliza índices como tan

0 3 6 
1 4 7 
2 5 8 

Los "significados" son idénticos en cuanto a la posición de la matriz.

a b tx 
c d ty 
0 0 1 

a, b, c, d escala codificar & rotación al mismo tiempo. tx/ty codificar traducción. Si haces m.getValues ​​(vals); entonces vals [2] == tx, vals [5] == ty, y el resto es sencillo. La mejor manera de extraer traducción es hacer un vector

float[] point = {0, 0}; 

Entonces Localizar en un mapa y ver dónde termina y que es su traducción (que es exactamente (tx, ty).En circunstancias poco comunes que no es

para obtener un mapa a escala de un segundo punto

float[] point2 = {1, 0}; 

Ahora toma la diferencia rel = (punto - punto2) y obtener la longitud de ese vector y que es su escala. Para extraer la rotación, normalice Rel y es sencillo obtener su ángulo estándar.