2016-10-07 222 views
2

我正在使用一些SVG文件,並且我想知道如何區分簡單的旋轉,從翻轉PLUS旋轉。SVG矩陣:不同的翻轉,旋轉和翻轉PLUS旋轉

我所知道的:

例如矩陣:

transform="matrix(a,b,c,d,e,f)" Theorical 
transform="matrix(1.866 0 -0 1.866 91.480 278.480)" Practical 

我們可以通過查看元素「a」和「d」定在這個矩陣元素的翻轉。負數「a」表示水平翻轉,負數「d」表示垂直翻轉。

當我做翻轉PLUS旋轉時,我的麻煩到了。事實是,當我做一個簡單的輪換時,「a」和「d」也可以是負的!那麼,如果我們只有一個翻轉,或者只有一個旋轉,或者一個旋轉加一個翻轉,我們該如何確定?

這裏是其上我做一個簡單的水平翻轉的元素的矩陣:

transform="matrix(-2.150 -0.012 -0.012 2.150 252.235 43.335)" 

「一」元件(-2.150)是負的。

這裏是其上我做135度的旋轉逆時針方向的元素的矩陣:

transform="matrix(-1.560 -1.479 1.479 -1.560 245.655 46.646)" 

「一」元件(-1.560)爲負過,但它是一個沒有簡單的旋轉翻轉。

這裏是其上我做了水平翻轉的元素的矩陣PLUS 135度逆時針方向旋轉:

transform="matrix(1.674 -1.349 -1.349 -1.674 238.428 45.969)" 

「一」元件(1.674)是翻轉的正dispite。

你知道一種方法,我可以隨時知道是否有簡單的旋轉,或簡單的翻轉,或旋轉加翻轉?

如果我不夠清楚,不要猶豫,問我更多的細節。

+1

[本類似的問題](http://stackoverflow.com/questions/5107134/find-the-rotation-and-skew-of-a-matrix-transformation)可以是幫幫我。 –

回答

0

感謝您的回答,但它並沒有完全回答我的問題。我找到了一個解決方案,所以我把它發佈在這裏。我知道我的解決方案不是最好的,可以輕鬆改進,但我沒有時間優化它。

這裏是我所做的:

與基質的a和b元件,我計算與ATAN2輻射角度(在Java中Math.atan2(B,A))。我以度數轉換它。

一旦我們得到了度角,我做了四種情況下,一個三角圈的每一個季度:

trignonometric circle

首先,我注意到,當你做一個翻轉(水平或垂直) ,「b」和「c」元素總是具有相同的符號。

所以,這裏是第一個條件:(符號b)==(符號c)。

根據「d」元素的「b」元素(或「c」,因爲「b」==「c」)AND的符號,我們可以確定是否進行水平或垂直翻轉。我們需要知道「b」和「c」的符號,加上「d」的符號。

最後一個條件是在開始時計算出的角度的符號。這將有助於我們確定旋轉角度。

我的理解是軸在我們翻轉時移動。

讓我告訴你完整的解決方案。我發現了四個條件,一是三角圓圈的每個季度:

double radianAngle = Math.atan2(b, a); 
double degreeAngle = Math.toDegrees(radianAngle); 
// if "b" and "c" have the same sign means there is a flip (H or V) 
if (((b < 0) == (c < 0))) { 
    if (b < 0 && d > 0 && degreeAngle < 0) { 
     // It is a horizontal flip 
     // The new angle is (- 180 - degreeAngle) 
    } else if (b > 0 && d < 0 && degreeAngle > 0) { 
     // It is a vertical flip 
     // The new angle is (-degreeAngle) 
    } else if (b > 0 && d > 0 && degreeAngle > 0) { 
     // It is a horizontal flip 
     // The new angle is (180 - degreeAngle) 
    } else if (b < 0 && d < 0 && degreeAngle < 0) { 
     // It is a horizontal flip 
     // The new angle is (-degreeAngle) 
    } 
} else { 
    // No flip (H or V) 
} 

有兩個匹配的情況下,以限制其條件:

if (degreeAngle == 180 && a < 0) { 
    // It is a pure horizontal flip, with no rotation 
} else if (degreeAngle == 0 && d < 0) { 
    // It is a pure vertical flip with no rotation 
} 

這是我最後使用,並且它適用於所有情況。 我認爲用更多的抽籤會更容易理解,但我沒有時間做更詳細的答案。

希望它能幫助,

2

簡答題:如果ad - bc < 0,這是一個反映。

長答案:如果我正確理解Mozilla docs,(x,y) - >(ax + cy,bx + dy)加上翻譯,我們不需要擔心。因此,我們所做的就是想象在三個維度上的向量:(x,y,0) - >(ax + cy,bx + dy,0)。取單元向量(1,0,0),和一個單元Ĵ向量(0,1,0)和應用變換到每個,得到我「J」

現在,狡詐位:計算的我 'J'cross product,看看它是否仍然在相同的方向指向爲 X Ĵ(= ķ,(0, 0,1))。如果是這樣,一對我「J」是相同的‘旋向性’作爲Ĵ和無反射已經發生。如果它相反(即指向-k)它已被反映。

通過數字手搖,我 ' =(A,B,0),J'爲(c,d,0),和我 ' X J'是(0,0 ,廣告-BC)。如果ad-bc < 0,那麼它指向-k並且已經發生反射。