有效地计算多个 pygame 对象之间的距离

efficiently calculate distance between multiple pygame objects

我有一个 pygame 程序,我想检查是否有任何兔子足够接近交配。在这样做时,我必须使用两个 for 循环,其中我使用两点公式之间的距离来计算距离。这个过程消耗了我的许多计算机资源并导致游戏性能急剧下降。

检查每只兔子之间距离的最有效方法是什么?

def mating(rabbits):
    for i in range(len(rabbits)):
        for x in range(len(rabbits)):
            if math.sqrt(math.pow((rabbits[i].xpos - rabbits[x].xpos),2) + math.pow((rabbits[i].ypos - rabbits[x].ypos),2)) <= 20:
                #add a new rabbit
                rabbits.append(rabbit())

在你的算法中,math.sqrt 消耗了大部分时间。计算平方根是非常昂贵的。比较距离的平方而不是距离,这样就不用计算平方根了。
您还计算了两次从一只兔子到另一只兔子的距离。请注意,您甚至可以计算兔子与自身的距离(当 i 等于 x 时)。此距离始终为 0。外层循环必须经过所有兔子。然而,内循环只需要遍历列表中的后续兔子(rabbits[i+1:])。

def mating(rabbits):
    for i, rabbit1 in enumerate(rabbits):
        for rabbit2 in rabbits[i+1:]:
            dx = rabbit1.xpos - rabbit2.xpos
            dy = rabbit1.ypos - rabbit2.ypos
            if dx*dx+dy*dy <= 20*20:
                #add a new rabbit
                rabbits.append(rabbit())