我正在使用动作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;
}
答案 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
而不是余数运算符%
计算提醒。链接页面还会显示如果您的语言不可用,请自行实现此功能。