代码之家  ›  专栏  ›  技术社区  ›  Carl Smith kyle k

两个旋转角度的函数,增加第一个角度使其更接近第二个角度

  •  -4
  • Carl Smith kyle k  · 技术社区  · 8 年前

    想象一下坦克上的炮塔。用户可以指定转台的旋转角度,但旋转需要一段时间,因为它只能如此快速地旋转。

    该功能不得导致转台旋转“长距离”。例如,如果当前为5弧度,目标为0,则返回值应大于5。

    yaw(0, 6) 回报 -0.01 什么时候该回来 6.273... (2-0.01)。

    const { sign, abs, PI } = Math;
    
    const yaw = function(current, target, increment=0.01) {
    
        const distance = current - target;
        const rotation = abs(distance) > PI ? sign(distance) : -sign(distance);
    
        return current + rotation * increment;
    };
    

    编辑

    const yaw = function(current, target, increment=0.01) {
    
        const distance = current - target;
        const rotation = abs(distance) > PI ? sign(distance) : -sign(distance);
        return (current + rotation * increment + TAU) % TAU;
    };
    
    1 回复  |  直到 8 年前
        1
  •  2
  •   MvG    8 年前

    如果你有 sin(current) cos(current) , sin(target) cos(target) (或者是这些的正倍数),那么下面的内容将是美好而优雅的:

    rotation = sign(sinTarget*cosCurrent - sinCurrent*cosTarget)
    

    它利用二维矢量在当前方向和目标方向形成的矩阵行列式的符号。这个行列式与 面向的 平行四边形的面积由这些向量构成,符号表示方向。

    如果这些三角函数不是为了某种目的而计算出来的,那么为了区分这种情况而计算它们可能是浪费资源。