更快的数学运算

5

可能重复:
极坐标转换为笛卡尔坐标的快速算法

我正在运行一些路径查找代码(有点慢)通过jvisualvm,我发现80%的时间都花在我的向量实现上,更具体地说是将笛卡尔坐标转换为极坐标的部分。

r = Math.sqrt((x * x) + (y * y));
t = Math.atan2(y,x);

有没有一些老派的技巧可以提高性能?

1
@PaulTomblin 但这是相反的情况... - Alnitak
2个回答

7
根据我在路径查找算法方面的经验,问题不在这些行。
主要问题是:“你调用这两行代码的次数有多少?”
你应该调查你的路径查找算法。
无论如何,如果你想减少这些代码的延迟,可以为每个x和y制作预先计算的sqrt和atan2表格。甚至可以制作一个将每个(x,y)映射到(r,t)的表格。

1

你应该考虑是否真的需要使用 Math.atan2()。在我的经验中,有很少的几何计算实际上需要实际角度;通过使用更自然的操作,您可以获得更快、更简单和更健壮的结果。

例如,如果您想评估两个向量(比如 ab)之间的角度,您通常可以使用点积:

(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()函数处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接