2016-10-07 183 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并且已经发生反射。