私は実験でシミュレーション機能を最適化しようとしています。これにより、一度により多くの人工脳制御エージェントを実行できるようになります。コードのプロファイルを作成したところ、現在のコードの大きなボトルネックは、すべてのエージェントからすべてのエージェントへの相対角度を計算していることです。これは、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度)を犠牲にするつもりです。