Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SVG矩阵:区分翻转、旋转和翻转加旋转_Svg_Matrix_Rotation_Transform - Fatal编程技术网

SVG矩阵:区分翻转、旋转和翻转加旋转

SVG矩阵:区分翻转、旋转和翻转加旋转,svg,matrix,rotation,transform,Svg,Matrix,Rotation,Transform,我正在处理一些SVG文件,我想知道如何区分简单旋转和翻转加旋转 据我所知: 示例矩阵: 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”表示垂直翻转 当我做翻转加旋转时,我的麻烦就来了。事实上,当我做一个简单的旋转时,“a”和“d”也可以是负数!那

我正在处理一些SVG文件,我想知道如何区分简单旋转和翻转加旋转

据我所知:

示例矩阵:

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”表示垂直翻转

当我做翻转加旋转时,我的麻烦就来了。事实上,当我做一个简单的旋转时,“a”和“d”也可以是负数!那么,我们如何确定我们只有一个翻转,或者只有一个旋转,或者旋转加上一个翻转

这是一个元素的矩阵,我在上面做了一个简单的水平翻转:

transform="matrix(-2.150 -0.012 -0.012 2.150 252.235 43.335)"
“a”元素(-2.150)为负数

这是一个元素矩阵,我在上面逆时针旋转了135度:

transform="matrix(-1.560 -1.479 1.479 -1.560 245.655 46.646)"
transform="matrix(1.674 -1.349 -1.349 -1.674 238.428 45.969)"
“a”元素(-1.560)也是负数,但它是一个简单的旋转,没有翻转

这是一个元素的矩阵,我在上面做了一个水平翻转加上一个135度的逆时针旋转:

transform="matrix(-1.560 -1.479 1.479 -1.560 245.655 46.646)"
transform="matrix(1.674 -1.349 -1.349 -1.674 238.428 45.969)"
“a”元素(1.674)是翻转的正位置

你知道一种方法吗?我可以用它来知道是简单的旋转,还是简单的翻转,还是旋转加翻转


如果我不够清楚,请毫不犹豫地向我询问更多细节。

简短回答:如果ad-bc<0,这是一种反映

长答案:如果我理解正确,(x,y)->(ax+cy,bx+dy)加上一个我们不需要担心的翻译

所以,我们要做的是想象三维向量:(x,y,0)->(ax+cy,bx+dy,0)。取一个单位i向量(1,0,0)和一个单位j向量(0,1,0),并对每个向量应用变换,得到i'j'

现在,狡猾的比特:计算i'j'的方向,看看它是否仍然指向与ixj(=k,(0,0,1))相同的方向。如果是这样,这对i'j'ij是相同的“利手”,并且没有发生反射。如果它是相反的(即指向-k),则它已被反射


翻阅数字,i'=(a,b,0)和j'是(c,d,0),而i'xj'是(公元前0,0)。如果ad bc<0,那么它指向-k,并且发生了反射。

谢谢你的回答,但它没有完全回答我的问题。我找到了一个解决方案,所以我把它贴在这里。我知道我的解决方案不是最好的,很容易改进,但我没有时间优化它

以下是我所做的:

使用矩阵的a和b元素,我用atan2计算辐射角(在Java Math.atan2(b,a)中)。我用度数表示它

得到度角后,我做了四个例子,三角圆的四分之一:

首先,我注意到当你翻转(水平或垂直)时,“b”和“c”元素总是有相同的符号

这里是第一个条件:(b的符号)==(c的符号)

根据“b”元素(或“c”的符号,因为“b”==“c”)和“d”元素的符号,我们可以确定是水平翻转还是垂直翻转

因此,为了精确地确定我们是否进行翻转(H或V),我们需要知道“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)
}
double radianAngle=Math.atan2(b,a);
双度角=数学到度(弧度角);
//如果“b”和“c”具有相同的符号,则表示存在翻转(H或V)
如果((b<0)=(c<0))){
如果(b<0&&d>0&°reeAngle<0){
//这是水平翻转
//新角度为(-180度角)
}否则,如果(b>0&&d<0&&d角度>0){
//这是一个垂直翻转
//新角度为(-degreeAngle)
}如果(b>0&&d>0&°reeAngle>0),则为else{
//这是水平翻转
//新角度为(180度角)
}否则如果(b<0&&d<0&°reeAngle<0){
//这是水平翻转
//新角度为(-degreeAngle)
}
}否则{
//无翻转(H或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
}
if(degreeAngle==180&&a<0){
//这是一个纯水平翻转,没有旋转
}否则如果(degreeAngle==0&&d<0){
//这是一个没有旋转的纯垂直翻转
}
这是我最后使用的,它适用于所有情况。 我想如果画得更多的话,会更容易理解,但我没有时间做更详细的回答

希望有帮助,

可能会有所帮助。