long龙8国际中文网

一个关于 编程问题的解答网站.

有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

无平方根空间向量的java规范化

所以我了解到在编程中使用平方根总是不好的做法,尤其是在每个更新步骤中。我试图在圆之间进行真实的弹性碰撞,我读到了:有没有一种方法可以在不使用平方根的情况下规范化向量?或者用什么快速的方法来做我正在做的事


共 (1) 个答案

  1. 进行归一化

    规范化一个向量意味着将其每个分量除以该向量的大小。震级等于sqrt(x**2 + y**2),其中xy是向量的分量。但是平方根很慢,我们宁愿避免它。所以,我们选择乘以震级的平方根的倒数,而不是除以sqrt(x**2 + y**2),也就是1 / sqrt(x**2 + y**2)

    为什么会有帮助?因为制作《地震III》的好人想出了一种非常快速的方法来计算^{,我们称之为快速逆平方根

    换句话说,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
    

    在执行其他冲突检查之前,请调用cull。当cull返回true时,不需要进行任何进一步的检查,因为两个圆不可能相互接触。这很好,因为cull几乎肯定会比您可能使用的其他碰撞检测方法更快。如果cull返回false,则圆的区域在某个地方重叠,因此您可以调用更昂贵的物理建模算法