我知道一个矩阵 [x缩放,y倾斜,x倾斜,y缩放,x平移,y平移],想要得到以度为单位的角度。
谢谢!
谢谢!
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));
}
Math.round(Math.asin(sin) * (180/Math.PI))
),然后它就像魔法般地工作了。 - oldboy| 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)
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
}
}
如果您想考虑翻译,那么您将进入一个困难的世界。