我知道矩阵[x scale,y skew,x skew,y scale,trans x,trans y],并且想要以度为单位获得角度。
谢谢!
答案 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元素的旋转角度。希望这能帮助别人解决我的麻烦。