2012-06-30 4 views
0

SVG 드로잉을위한 자바 코드가 있습니다. rotate을 비롯한 변형을 처리하며, Chrome에서의 렌더링과 비교하여 수많은 테스트 그림에서 볼 수있는 한 매우 잘 수행합니다. 다음으로 필요한 것은 변환을 통해 선언 된 많은 이미지에있는 실제 객체 위치를 얻는 것입니다. 그래서 나는 드로잉에 사용 된 매트릭스에서 X와 Y를 읽는 것으로 결정했습니다. 불행히도 rotate 변환에 대한 잘못된 값을 얻습니다. 즉, 이미지의 실제 개체 위치에 해당하지 않습니다.SVG 회전을위한 이상한 매트릭스 변환

다운 박리 코드는 다음과 같다 :

Matrix matrix = new Matrix(); 
float cx = 1000; // suppose this is an object X coordinate 
float cy = 300;  // this is its Y coordinate 
float angle = -90; // rotate counterclockwise, got from "rotate(-90, 1000, 300)" 

// shift to -X,-Y, so object is in the center 
matrix.postTranslate(-cx, -cy); 
// rotate actually 
matrix.postRotate(angle); 
// shift back 
matrix.postTranslate(cx, cy); 
// debug goes here 
float[] values = new float[9]; 
matrix.getValues(values); 
Log.v("HELLO", values[Matrix.MTRANS_X] + " " + values[Matrix.MTRANS_Y]); 

로그 (700)는 1300의 값을 각각 출력한다. 나는 0과 0을 기대할 것입니다. 왜냐하면 객체가 내 이미지에서 (즉 움직임이 없음) 회전 된 것을 볼 수 있기 때문이며 postTranslate 호출은 서로를 보완해야합니다. 물론이 값이 1000과 300에서 어떻게 형성되는지는 알지만 그 이유는 이해하지 못합니다. 다시 한 번,이 이상한 값을 가진 행렬은 실제 객체 드로잉에 사용되며 올바른 것으로 지적합니다. 누군가 여기서 일어날 일을 설명 할 수 있을까요? 내가 놓친 게 있니? 지금까지 문제의 해결책은 하나만 있습니다. rotate에서 위치를 얻으려고 시도하지 말고 명시적인 matrixtranslate 변형에 대해서만 수행하십시오. 그러나이 접근법은 보편성이 부족합니다. 그리고 어쨌든 매트릭스는 모든 변형 유형에 대해 적절한 값 (오프셋 포함)을 가져야한다고 생각했습니다.

답변

0

대답은 행렬이 공간 변환을위한 연산자이므로 개체 위치를 직접 추출하는 데 사용해서는 안된다는 것입니다. 대신에, 하나는 SVG 태그 xy 속성에 지정된 초기 오브젝트 좌표를 얻고, 그것들에 매트릭스를 적용한다 : 우리는 x와 y의 변수의 적절한 위치 값을 얻을 그 후

float[] src = new float[2]; 
src[0] = cx; 
src[1] = cy; 
matrix.mapPoints(src); 

한다.