Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无平方根的空间向量归一化_Java_Math_Collision_Geometry - Fatal编程技术网

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),你能举个例子吗?你想让我澄清什么?希望我能给出一个例子,让我知道什么是不清楚的。我有一个函数来求逆平方根,但是我如何从那一点规范化向量?谢谢,这是一个非常有用的答案!