0

別のベクトルから提供された角度に最も近いセットで2Dベクトルを見つけようとしています。

したがって、たとえば、 v(10, 10)90度の角度に沿って最も近い他のベクトルを見つけたい場合はv(20, 10)、見つける必要があります。2つのベクトル間の正しい方位を返すと思うメソッドを作成しました。

float getBearing(
    const sf::Vector2f& a, const sf::Vector2f& b)
{
    float degs = atan2f(b.y - a.y, b.x - a.x) * (180 / M_PI);
    return (degs > 0.0f ? degs : (360.0f + degs)) + 90.0f;
}

これは問題なく機能しているようですが、上下に配置すると、180が返されますが、これは問題ありませんが、360は奇妙です。真上にある場合は0を返す必要がありますか?そのための最良の方法は、360をチェックして、0を返すことだと思います。

私の問題は、通過した角度、たとえば90度と、から返された角度の違いを理解できないことgetBearingです。返されるベアリングがすべての状況で正しいかどうかさえわかりません。

誰かが私のベアリング方法の明白な間違いを修正し、2つのベアリングの違いを得る方法を提案するのを手伝ってもらえますか?私はインターネットで探していましたが、それを行う方法はたくさんあり、そのほとんどは他の言語で示されています。

ありがとう。

4

3 に答える 3

3

特定の角度に最も近いベクトルを見つけるだけでよい場合は、@swtdrgnメソッドに従うことができます。代わりに、実際に2つのベクトル間の角度差を計算する必要がある場合は、内積の単純なプロパティを利用できます。

内積の幾何学的定義

ここで、シータは2つのベクトル間の角度です。したがって、式を逆にすると、次のようになります。

上記の式の逆

于 2012-12-26T16:18:39.643 に答える
2

比較されている2つのベクトルを取得し、単位内積を実行することをお勧めします。最も近い方位が最大である必要があります。1が最大(ベクトルが同じ方向を指していることを意味します)、-1が最小(ベクトルが反対方向を指していることを意味します)です。

于 2012-12-26T16:02:38.840 に答える
0

私は今のところ解決策を見つけました。私はこれを解決するためにかなりの時間を費やしました、そして私は最終的にSOに尋ねた数分後にそれをします、典型的です。これを行うにはもっと良い方法があるかもしれないので、私はまだ他の答えからの提案を受け入れています。

現時点では、質問の方位法を使用しています。この方法では、常に0〜360の値が返されます。次に、戻り値と指定された角度の差が次のように取得されます。

fabs(fmodf(getBearing(vectorA, vectorB) + 180 - angle, 360) - 180);

これにより、2つのベクトル間の方位間の距離を度単位で測定する正のフロートが返されます。@swtdrgnの回答は、2つのベクトルの内積を使用することを示唆しています。実際には角度は必要なく、差が必要なだけなので、これは方位法よりもはるかに簡単かもしれません。

于 2012-12-26T16:09:00.730 に答える