可能重复:
Fast algorithm for polar -> cartesian conversion更快的数学OPS
我正在通过jvisualvm一些寻路代码(这是一个有点慢),我发现的是,80%的时间被浪费在我的向量执行花了更具体的是转换笛卡尔坐标到极的一部分,
r = Math.sqrt((x * x) + (y * y));
t = Math.atan2(y,x);
是回到任何旧学校的伎俩,会让我更多的表现?
可能重复:
Fast algorithm for polar -> cartesian conversion更快的数学OPS
我正在通过jvisualvm一些寻路代码(这是一个有点慢),我发现的是,80%的时间被浪费在我的向量执行花了更具体的是转换笛卡尔坐标到极的一部分,
r = Math.sqrt((x * x) + (y * y));
t = Math.atan2(y,x);
是回到任何旧学校的伎俩,会让我更多的表现?
在我的路径发现算法的经验中,问题不在于这些线条。
主要问题是“你称这两条线多少次?”
你应该研究你的路径寻找算法。
无论如何,如果你想减少这些线路的延迟,也可能使预先计算表sqrt
和atan2
每个x
和y
。或者甚至是一个将每个(x,y)直接映射到(r,t)的表。
你应该考虑你是否真的需要使用Math.atan2()
。根据我的经验,几乎不需要实际角度的几何计算;通过使用更自然的操作,您可以获得更快,更简单,更稳健的结果。
例如,如果您要计算两个向量(比如,a
和b
)之间的角度,可以改为经常使用的点积:
(a.x*b.x + a.y*b.y) = |a| |b| cos(angle)
和一种臀“跨产品” :
(a.x*b.y - a.y*b.x) = |a| |b| sin(angle)
这种“跨产品”是特别有用,因为符号告诉你哪个矢量a
载体的侧b
点。
如果事实证明你真的做需要(通常为人类可读的输出)的角度,这些值是输入做出atan2()
裁缝。
@PaulTomblin但这是另一种方式...... – Alnitak