从矩阵中获取角度

时间:2011-02-21 23:01:47

标签: javascript math actionscript trigonometry

我知道矩阵[x scale,y skew,x skew,y scale,trans x,trans y],并且想要以度为单位获得角度。

谢谢!

3 个答案:

答案 0 :(得分:4)

考虑以下矩阵

| x_sc  y_sk  0  |
| x_sk  y_sc  0  |
| x_tr  y_tr  1  |

sk表示偏差,sc表示比例,tr表示翻译。

如果所有三个都为真

,则仅代表轮换
y_sk == -x_sk
y_sc == x_sc
x_sc * y_sc - x_sk * y_sk == 1

在这种情况下,如果theta是旋转角度,那么

theta == arcos(x_sc)

这将以弧度(最有可能)为您提供答案,因此您需要转换为学位。

假设您有一个名为M的对象,代表矩阵,与上述定义匹配的属性,您可以这样做:

function toPureRotation(var M) {
    if( (M.y_sk != (-1 * M.x_sk)) ||
        (M.y_sc != M.x_sc) ||
        ((M.x_sc * M.y_sc - M.x_sk * M.y_sk) != 1)
    ) {
        return Number.NaN;
    }
    else {
        return Math.acos(M.x_sc); // For radians
        return Math.acos(M.x_sc) * 180 / Math.PI; // For degrees
    }
}

修改

对于纯旋转,然后是(或之前)保持纵横比的缩放变换:

| sc   0  0 |
|  0  sc  0 |
|  0   0  1 |

然后你可以使用以下身份:

x_sc * y_sc - x_sk * y_sk == sc^2

这给了我们

function toRotation(var M) {
    if( (M.y_sk != (-1 * M.x_sk)) ||
        (M.y_sc != M.x_sc)
      )
    ) {
        return Number.NaN;
    }
    else {
        var scale_factor = Math.sqrt((M.x_sc * M.y_sc - M.x_sk * M.y_sk));
        return Math.acos(M.x_sc/scale_factor); // For radians
        return Math.acos(M.x_sc/scale_factor) * 180 / Math.PI; // For degrees
    }
}

如果你想要考虑翻译,你就会进入一个受伤的世界。

答案 1 :(得分:4)

非常简单

1:获取矩阵并保存在变量

matrix='matrix(0.8660254037844387, 0.49999999999999994, -0.49999999999999994, 0.8660254037844387, 0, 0)';

2:拆分价值

var values = matrix.split('(')[1],
    values = values.split(')')[0],
    values = values.split(',');

var sin = values[1]; // 0.5

3:计算角度

var angle = Math.round(Math.asin(sin) * (180/Math.PI));

结果:

function convertToAngle(matrix) {
     var values = matrix.split('(')[1],
        values = values.split(')')[0],
        values = values.split(',');

    var sin = values[1]; // 0.5

    return Math.round(Math.asin(sin) * (180/Math.PI));
}

答案 2 :(得分:2)

我将把它放在这里供将来参考。我继续创建了一个快速的jQuery方法,试图计算给定HTML元素的旋转角度。希望这能帮助别人解决我的麻烦。

https://gist.github.com/1492454