【发布时间】:2012-06-10 18:08:09
【问题描述】:
我正在尝试优化实验中的模拟功能,以便一次运行更多的人工大脑控制代理。我分析了我的代码,发现我的代码现在的最大瓶颈是计算每个代理到每个代理的相对角度,即 O(n2),减去我所做的一些小优化.这是我用于计算角度的当前代码 sn-p:
[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;
}
我有两个二维点 (x1, y1) 和 (x2, y2 ) 和“从”点的朝向 (xa)。我想计算代理 x 需要转向(相对于其当前面向)面对代理 y 的角度。
根据分析器,最昂贵的部分是 atan2。我已经用谷歌搜索了几个小时,上面的解决方案是我能找到的最好的解决方案。有谁知道计算两点之间角度的更有效方法?我愿意为速度牺牲一点精度(+/- 1-2 度),如果这会影响任何事情的话。
【问题讨论】:
-
不,抱歉。浮点非线性数学很昂贵。
-
“我的代码现在最大的瓶颈是计算每个代理到每个代理的相对角度”您是否考虑过...不这样做?首先,向量数学通常不需要角度;它只使用向量。您在需要特定角度的地方使用了哪些功能?其次,为什么你需要为每一对代理计算这个?你不是只需要为彼此亲近的人计算它吗?处理对附近实体进行分组的技术有很多。
-
sin andere cos 的查找表怎么样?你考虑过吗??
-
@Nicol: 我正在为每个代理模拟 180 度的正面视网膜,所以我需要这个角度,以便我知道将视网膜的哪个部分标记为“有另一个代理”在里面。”我已经预先计算了距离并过滤掉了超出代理可能视野距离的代理。我还考虑过在决定计算相对角度之前以某种方式确定代理 y 是否在代理 x 前面,但我发现这是一个难题,而不会产生类似的直接计算角度的成本。
-
@Matthias:我怀疑这会更快(假设我们在这里谈论的是现代桌面/服务器平台)。
标签: c++ math optimization game-physics