如何有效地计算两点之间的角度?

Ran*_*son 2 c++ math optimization game-physics

我正在尝试在我的实验中优化模拟功能,这样我就可以在一次运行更多的人工脑控制代理.我分析了我的代码并发现我的代码中的大瓶颈是计算每个代理与每个代理的相对角度,即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;
}
Run Code Online (Sandbox Code Playgroud)

我有两个2D点(x 1,y 1)和(x 2,y 2)和面向"从"点(x a).我想计算代理x需要转向(相对于当前面向)面对代理y的角度.

根据剖析器,最昂贵的部分是atan2.我用谷歌搜索了几个小时,上面的解决方案是我能找到的最佳解决方案.有谁知道一种更有效的方法来计算两点之间的角度?如果这会影响任何事情,我愿意牺牲一点准确度(+/- 1-2度)来提高速度.

Oli*_*rth 6

正如评论中所提到的,可能存在降低计算负荷的高级方法.

但是对于手头的问题,你可以使用点 - 产品关系:

theta = acos ( a . b / ||a|| ||b|| )
Run Code Online (Sandbox Code Playgroud)

在哪里ab是你的向量,.表示"点积"并|| ||表示"向量幅度".

从本质上讲,这将取代您的{ sqrt,cos,sin,atan2} {用sqrt,acos}.

我还建议坚持使用弧度进行所有内部计算,只转换为人类可读I/O的度数.