Java 无平方根的空间向量归一化
所以我了解到在编程中使用平方根总是不好的做法,尤其是在每个更新步骤中。我试图在圆之间进行真实的弹性碰撞,我一直在读这篇文章:有没有一种不用平方根来规范化向量的方法?或者用任何快速的方法来做我正在做的事情?乘以要标准化的大小平方的值。 规范化向量意味着将向量的每个分量除以向量的大小。幅值等于Java 无平方根的空间向量归一化,java,math,collision,geometry,Java,Math,Collision,Geometry,所以我了解到在编程中使用平方根总是不好的做法,尤其是在每个更新步骤中。我试图在圆之间进行真实的弹性碰撞,我一直在读这篇文章:有没有一种不用平方根来规范化向量的方法?或者用任何快速的方法来做我正在做的事情?乘以要标准化的大小平方的值。 规范化向量意味着将向量的每个分量除以向量的大小。幅值等于sqrt(x**2+y**2),其中x和y是矢量的分量。但是平方根很慢,我们宁愿避免它。因此,我们不必除以sqrt(x**2+y**2),而是选择乘以幅值的平方根,即1/sqrt(x**2+y**2) 为什么会
sqrt(x**2+y**2)
,其中x
和y
是矢量的分量。但是平方根很慢,我们宁愿避免它。因此,我们不必除以sqrt(x**2+y**2)
,而是选择乘以幅值的平方根,即1/sqrt(x**2+y**2)
为什么会有帮助?因为制作《地震III》的好人想出了一种非常快速的方法来计算1/sqrt(x**2+y**2)
,我们称之为快速平方根逆
换句话说,fisqrt(x)
等于1/sqrt(x)
,但计算fisqrt(x)
要比计算1/sqrt(x)
快得多
这里有一些伪python来说明如何将这些放在一起
def fisqrt(x):
# See article for implementation details.
def normalize(vector):
magnitude_squared = vector.x**2 + vector.y**2
invsqrt = fisqrt(magnitude_squared)
vector.v *= invsqrt
vector.y *= invsqrt
return vector
此外,您还可以“剔除”更昂贵的冲突检查(下面是伪python):
def magnitudeSquared(vector):
return vector.x ** 2 + vector.y ** 2
def cull(circleA, circleB):
# Save a square root by calling magnitudeSquared.
# Assuming that circle.center is a vector with x and y components.
minCollisionDistance = circleA.radius + circleB.radius
if magnitudeSquared(circleA.center - circleB.center) <= minCollisionDistance ** 2:
# Circles overlap, can't cull.
return false
# Circles do not overlap, can cull!
return true
def幅值平方(矢量):
返回向量.x**2+向量.y**2
def消隐(圆圈、圆圈):
#通过调用magnitySquared保存平方根。
#假设circle.center是包含x和y分量的向量。
最小碰撞距离=圆形半径+圆形半径
如果震级平方(circleA.center-circleB.center),你能举个例子吗?你想让我澄清什么?希望我能给出一个例子,让我知道什么是不清楚的。我有一个函数来求逆平方根,但是我如何从那一点规范化向量?谢谢,这是一个非常有用的答案!