javascript - 旋转函数的内部结构

标签 javascript matrix rotation

我正在寻找有关修改二维矩阵的旋转函数中发生的情况的信息。我发现了这一点,但将旋转指定为 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 时,什么也不会发生。

最佳答案

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

我会摆脱-= 0.001 hack,在90度时,sin应该是1cos 应该是 0 (或者至少非常接近它),从而实现以下转换:

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

关于javascript - 旋转函数的内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12049003/

相关文章:

javascript - 带有 URL 链接且不重复的旋转横幅

Java - 让 ArrayList 值在游戏中旋转

javascript - 为什么我难以通过 href ="element"滚动?

javascript - Firefox 插件 sdk/tabs : "ready" event doesn't fire on all page loads?

arrays - matlab中矩阵中的不重复数组

c++ - 模板参数变量/动态实例化

javascript - Three.js:结合 tween.js 围绕世界轴旋转对象

javascript - 奇怪的 JS 语法,它是什么意思?

javascript - React 更新状态数组对象单个属性

c - 在 C 中处理大 float 据