旋转功能的内部

时间:2012-08-21 05:40:26

标签: javascript matrix rotation

我正在寻找有关修改2d矩阵的旋转函数的信息。我发现了这一点,但将旋转指定为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时没有任何反应。

1 个答案:

答案 0 :(得分:0)

不确定您的a,b,c和d用于什么,但只要有可能,您应保留所有原始值并使用绝对角度计算旋转值。否则,正如你所提到的,不准确的总和将变得越来越明显。

我会摆脱-= 0.001黑客,在90度,sin应为1cos应为0(或至少非常接近它),实现以下转变:

a' := -b
b' := a
c' := -d
d' := c
tx' := -ty
ty' := tx