航向从359-1或1-359改变时的罗盘误差。C#Windows Phone 8
我正在实现横向模式增强现实应用程序。左上角的小圆圈是指南针,指示北方的位置。以前我在肖像模式下使用它。而且它绝对工作得很好。但当我换工作时,有两个问题。在纵向模式下也存在一个问题航向从359-1或1-359改变时的罗盘误差。C#Windows Phone 8,c#,visual-studio-2012,windows-phone-8,augmented-reality,C#,Visual Studio 2012,Windows Phone 8,Augmented Reality,我正在实现横向模式增强现实应用程序。左上角的小圆圈是指南针,指示北方的位置。以前我在肖像模式下使用它。而且它绝对工作得很好。但当我换工作时,有两个问题。在纵向模式下也存在一个问题 当真航向从1变为359或359变为1时,指南针不知道直接取最短的角度,但它会旋转整圈并转到最终航向。比如当真航向为1度时,我将设备转向稍微北一点以形成真航向358,它不会直接从1-0-359-358开始,它会从1-2-5-200-300-358开始走一条完整的路径,即几乎是一个完整的圆。 这是因为我正在使用情节提要双动
对于第1点,您要做的是在旋转角度大于180°时检测情况,然后选择较短的路径
var rotation = newAngle - oldAngle;
if (Math.Abs(rotation) > 180)
{
// Rotating of more than 180, which means it exists a shorter path
newAngle += rotation > 0 ? -360 : 360;
}
// Start the animation to rotate to newAngle
如果旧角度为1,新角度为359,则旋转为358。它是正的,所以代码将从360减去359,因此从1旋转到-1
如果旧角度为359,新角度为1,则旋转将为-358。它是负数,所以代码将360加1,因此从359旋转到361
注:在第二种情况下,旋转后,角度将为361。然后你会遇到完全相同的问题,你尝试旋转到2°或3°,算法会将角度修正到362、363,依此类推。在某个时刻,如果指南针继续朝同一方向旋转,角度将达到540,算法将停止正常工作。为防止此类问题,您需要检测动画何时停止(存在该事件),然后调整角度,使其保持在0-359范围内:
if (angle > 359)
{
angle += (angle / 360) * -360;
}
else if (angle < 0)
{
angle += ((angle / 360) - 1) * -360;
}
if(角度>359)
{
角度+=(角度/360)*-360;
}
否则,如果(角度<0)
{
角度+=((角度/360)-1)*-360;
}
由于将角度更改为360的倍数,因此此调整不会产生视觉影响。对于第一个点,一个解决方法是将角度从359更改为361,而不是从359更改为1。如何操作?因为我将直接将trueheading值反馈给旋转。太棒了。谢谢。让我试试这个。它对我的实现不起作用。不管怎样,我通过你早些时候的建议实现了我想要的。我将compositetranform命名并使用compositetransform.rotation=TrueTHeading。而且效果很好。你知道我如何在timer_Tick事件运行时检查设备的方向吗?这样当方向为横向时,我就可以与真航向相反90度,这样指针就总是朝北?@VenkatapathiRajuM你试过检查页面的
方向属性吗?没有,让我想想。谢谢:)我正在用一种类似的方法。主要区别在于我将动画从和更改为值。在从359到1的情况下,我将from值设置为-1,将to值设置为1,它始终是正确的值。至于旋转问题,我目前也在使用页面方向和加速计信息来解决它。