旋转方向连续检查

时间:2014-05-13 22:01:09

标签: c# actionscript-3 angle difference

我正在使用动作3中的moltitouch应用程序,我也在C#中移植它,基本上,我正在使用旋钮,可以用手指旋转,我想要实现的目标是旋转CW或CCW我可以有连续方向,而不是每次角度都经过180我有一个方向的反转,任何提示?

哪种方式可以检测到连续旋转方向?

这是我要检测方向的代码:

private function findDirection(currentAngle : Number, targetAngle : Number) : int
{
    currentAngle = refineAngle(currentAngle);
    targetAngle = refineAngle(targetAngle);

    if (targetAngle < 0)
    {
        targetAngle +=  (Math.PI * 2);
    }

    if (currentAngle < 0)
    {
        currentAngle +=  (Math.PI * 2);
    }

    if (targetAngle < currentAngle)
    {
        targetAngle +=  (Math.PI * 2);
    }

    if (targetAngle - currentAngle <= Math.PI)
    {
        return 1;
    }
    else
    {
        return -1;
    }
}

private function refineAngle(angle : Number) : Number
{
    return angle * Math.PI / 180;
}

1 个答案:

答案 0 :(得分:0)

也许这有帮助。变量continuousAngle将跟踪执行的总旋钮旋转,即逆时针旋转旋钮两次将使您进入720。然后顺时针旋转三次会使您回到-360。其他所有内容都应该很容易派生 - 限制最小值和最大值,使值环绕,将值缩放到例如每回合1或其他任何你想要的值。

var lastAngle = 0;

var continuousAngle = 0;

function HandleDown(angle)
{
    lastAngle = angle;
}

function HandleMove(angle)
{
    // The orientation change in degrees of the knob since the last event with
    // a range of [-180;+180). A positive value indicates counterclockwise, a
    // negative value clockwise turning.
    var change = (360 + angle - lastAngle) % 360;

    if (change >= 180)
    {
        change -= 360;
    }

    // It may also be a good idea to not update continuousAngle if the absolute
    // value of change is larger than say 10°, 20° or 40° because such large
    // changes may indicate some kind of glitch like the user moving straight
    // across the knob. But I am not sure and 20 is just a random guess.
    if (Math.Abs(change) <= 20)
    {
        continuousAngle += change;
    }

    lastAngle = angle;
}

对于浮点数,可以使用Math.IEEEReminder而不是余数运算符%计算提醒。链接页面还会显示如果您的语言不可用,请自行实现此功能。