当标题从359-1或1-359变化时,指南针错误。 C#Windows Phone 8

时间:2013-09-07 18:46:52

标签: c# visual-studio-2012 windows-phone-8 augmented-reality

Landscape mode with compass at top left

我正在实施横向模式增强现实应用。左上角的小圆圈是指示北方所在位置的指南针。以前我在肖像模式下使用它。它绝对正常。但当我转移到有两个问题。在肖像模式中也存在一个问题。

  1. 当真正的标题从1变为359或359变为1时,指南针不知道直接采用最短的角度,但它会旋转整个圆圈并进入最后的标题。就像当真正的度数是1度而我将设备稍微向北转动以形成真正的标题358时,它并不直接从1-0-359-358,它需要1-2-5-200-300-的完整路径358即几乎完整的圆圈。 这是因为我使用storyboard双动画制作旋转动画。那么我该如何解决这个问题?
  2. 第二个问题是,正如您可以很容易理解的那样,真正标题的参考轴是设备的顶部,当设备的顶部朝向北方时,圆圈中的N字母始终位于绿色区域。即相对于放置它的网格0度。但是我希望它采用参考线来测量角度,通过该角度变成线连接装置的顶部和底部。 我该如何实现这一目标?如何将双动画的参考线90degree设置为原始??
  3. 这里似乎有一个错误,因为我无法添加代码。但这里是文本文件,其中包含我想要向您展示的代码。 Code sample explained above

1 个答案:

答案 0 :(得分:0)

对于您的第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;
}

由于您将角度改变为360的倍数,因此对此调整不会产生视觉影响。