2

私は実験でシミュレーション機能を最適化しようとしています。これにより、一度により多くの人工脳制御エージェントを実行できるようになります。コードのプロファイルを作成したところ、現在のコードの大きなボトルネックは、すべてのエージェントからすべてのエージェントへの相対角度を計算していることです。これは、O(n 2)から、実行したいくつかの小さな最適化を差し引いたものです。角度を計算するために私が持っている現在のコードスニペットは次のとおりです。

[C++]
double calcAngle(double fromX, double fromY, double fromAngle, double toX, double toY)
{
    double d = 0.0;
    double Ux = 0.0, Uy = 0.0, Vx = 0.0, Vy = 0.0;

    d = sqrt( calcDistanceSquared(fromX, fromY, toX, toY) );

    Ux = (toX - fromX) / d;

    Uy = (toY - fromY) / d;

    Vx = cos(fromAngle * (cPI / 180.0));
    Vy = sin(fromAngle * (cPI / 180.0));

    return atan2(((Ux * Vy) - (Uy * Vx)), ((Ux * Vx) + (Uy * Vy))) * 180.0 / cPI;
}

2つの2Dポイント(x 1、y 1)と(x 2、y 2)と「from」ポイント(x a)の向きがあります。エージェントxがエージェントyに面するために(現在の向きに対して)回転する必要がある角度を計算したいと思います。

プロファイラーによると、最も高価な部分はatan2です。私は何時間もグーグルしてきました、そして上記の解決策は私が見つけることができる最高の解決策です。2点間の角度を計算するためのより効率的な方法を知っている人はいますか?それが何かに影響を与える場合、私は速度のために少しの精度(+/- 1-2度)を犠牲にするつもりです。

4

5 に答える 5

6

コメントで言及されているように、計算負荷を軽減するための高レベルのアプローチがおそらくあります。

しかし、当面の質問には、ドット積の関係を使用できます。

theta = acos ( a . b / ||a|| ||b|| )

どこでabあなたのベクトル.は、「内積」を|| ||示し、「ベクトルの大きさ」を示します。

sqrt基本的に、これは { , cos, sin, atan2} を { sqrt, }に置き換えますacos

また、すべての内部計算はラジアンに固執し、人間が判読できる I/O の度数への変換のみを行うことをお勧めします。

于 2012-06-10T18:17:53.930 に答える
1

あなたのコメントは多くのことを物語っています。いいえ、あなたはしません。位置ベクトルとビジョン ベクトルの間の角度が 90 度より大きいか小さいかを知る必要があるだけです。

これは非常にA·B簡単です。A と B の間の角度が 90 度未満の場合、内積は >0 です。角度が正確に 90 度の場合は 0、角度が 90 度を超える場合は <0。これを計算するには、3 回の乗算と 2 回の加算が必要です。

于 2012-06-11T09:10:15.007 に答える
0

これら 2 つのベクトルの内積を使用します。最悪の場合、代わりに逆余弦を計算する必要があります。

A = 向いている方向。B = エージェント X からエージェント Y の方向

ドットの計算は単純な掛け算と足し算です。そこから、角度の余弦が得られます。

于 2012-06-10T18:22:37.447 に答える
0

手始めに、計算を少し減らすことができる単純化がいくつかあることを理解する必要があります。

  1. エージェントからそれ自体への角度を計算する必要はありません。
  2. エージェント i からエージェント j への角度がわかっている場合、エージェント j からエージェント i への角度についてはすでにわかっています。

「エージェント i がエージェント j に向き合う」とはどういう意味ですか? 2 つの面が互いに正対している場合、計算を行う必要がありますか? 「お互いを直視する」ことに対して、あなたはどの程度の許容度を持っていますか?

数学に集中するのをやめて、問題をもっと詳しく説明してくれれば、何をすべきかを勧めやすくなります。

于 2012-06-10T18:59:37.080 に答える
0

私はそれがより数学的な問題だと思います:

試す

abs(arctan((y1-yfrom)/(x1-xfrom)) - arctan(1/((y2-yfrom2)/(x2-xfrom2))))

于 2012-06-10T18:17:52.073 に答える