2012-06-30 79 views
0

我有用於SVG繪圖的java代碼。它處理包括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屬性指定,並應用在其上的矩陣:

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

這一點,我們得到變量x和y適當的位置值之後。