0

左上にコンパスがある横向きモード

ランドスケープモードの拡張現実アプリを実装しています。左上の小さな円は、北を示すコンパスです。以前はポートレートモードで使用していました。そして、それは絶対にうまくいきました。しかし、私がにシフトしたとき、2つの問題があります。ポートレートモードにもすでに1つの問題があります。

  1. 真方位が 1 から 359 または 359 から 1 に変わるとき、コンパスは最短角度を直接取得することを認識しませんが、完全な円をすべて回転させて最終方位に移動します。たとえば、真方位が 1 度で、デバイスを少し北に向けて真方位を 358 にすると、1-0-359-358 から直接移動するのではなく、1-2-5-200-300- からフル パスを取ります。 358 つまり、ほぼ完全な円です。これは、ストーリーボードのダブル アニメーションを使用して回転をアニメートしているためです。では、どうすればこれを修正できますか?
  2. 2 つ目の問題は、おわかりのように、真方位の基準軸はデバイスの上部であり、デバイスの上部が北に向いている場合、円の N の文字は常に緑色の領域にあります。つまり、配置されているグリッドに対して 0 度です。ただ、角度を測る基準線は、デバイスの上下を結ぶ線にしてほしい。どうすればこれを達成できますか? ダブルアニメーションの基準線をオリジナルに対して90度に設定するにはどうすればよいですか??

コードを追加できないため、ここにバグがあるようです。しかし、ここに示したいコードを含むテキスト ファイルがあります。 上記で説明したコードサンプル

4

1 に答える 1

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 に回転します。

注: 2 番目のケースでは、回転後の角度は 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 度の倍数で角度を変更しているため、この調整による視覚的な影響はありません。

于 2013-09-08T09:09:45.977 に答える