可能重复:
极坐标转换为笛卡尔坐标的快速算法
我正在运行一些路径查找代码(有点慢)通过jvisualvm,我发现80%的时间都花在我的向量实现上,更具体地说是将笛卡尔坐标转换为极坐标的部分。
r = Math.sqrt((x * x) + (y * y));
t = Math.atan2(y,x);
有没有一些老派的技巧可以提高性能?
可能重复:
极坐标转换为笛卡尔坐标的快速算法
我正在运行一些路径查找代码(有点慢)通过jvisualvm,我发现80%的时间都花在我的向量实现上,更具体地说是将笛卡尔坐标转换为极坐标的部分。
r = Math.sqrt((x * x) + (y * y));
t = Math.atan2(y,x);
你应该考虑是否真的需要使用 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()
函数处理。