我正在寻找有关修改二维矩阵的旋转函数中发生的情况的信息。我发现了这一点,但是将旋转指定为 90、180 或 270 不会呈现任何变化。这是我的代码:
Matrix.prototype.rotate = function(deg) {
var radians = deg * Math.PI / 180,
sin = Math.sin(radians),
cos = Math.cos(radians),
a = this.a,
b = this.b,
c = this.c,
d = this.d,
tx = this.tx,
ty = this.ty;
this.a = a*cos - b*sin;
this.b = a*sin + b*cos;
this.c = c*cos - d*sin;
this.d = c*sin + d*cos;
this.tx = tx*cos - ty*sin;
this.ty = tx*sin + ty*cos;
}
我确实设法找到了一些关于它为什么不起作用的信息,但没有关于如何修复它的信息。据我了解,旋转 90 度会导致 sin 和/或 cos 如此之小,以至于当应用于矩阵时,它不会改变任何东西。如果我对此有误,请告诉我。
为了让它工作,我将它添加到函数的开头:
if(!(deg % 90)) {
deg -= .0001;
}
它有效,但我确信在旋转数千次后它不会非常准确。有谁知道更好的解决方案?
实际的旋转值存储在其他地方,如果有帮助,只会将差异传递给函数。
编辑:我忘了提到当 sin 或 cos 等于 1 或 -1 时什么都不会发生。