0

我是编程新手,我正在尝试在 python 中制作一个小 boids 算法,到目前为止,我已经编写了一种方法来使用平方反比函数将 boids 彼此分开,它看起来像这样:

def separation(self, boids):
    repulsion = Vector(0, 0)
    magnitude = 0
    for Boid in boids:
        if Boid != self:
            distance = Boid.position - self.position
            if np.linalg.norm(distance) < 100:
                magnitude = 100/(np.linalg.norm(distance) ** 2)
                direction = math.atan2(distance.y, distance.x)
                repulsion = repulsion - Vector(magnitude * cos(direction), magnitude * sin(direction))

    return repulsion

由于一个 boid 没有特权或任何东西,因此任何两个 boid 都应该以相同的力量相互排斥。然而,当我用 2 个相隔 10 个单位且没有初始速度的 boid 进行测试时,一个 boid 的加速明显快于另一个。我将误差追溯到距离变量,boids 用来计算排斥强度,我让两个 boids 都打印了这个变量。在第一个时间帧上,一个 boid 将另一个 boid 视为 10 个单位,而另一个将其视为 11 个单位(实际上,它是 -11,但由于它是平方的,所以符号无关紧要)。然后我打印出它们的位置并减去它们以在第一帧时间手动计算它们的距离值,看看它是否与距离方程有关,它产生了正确的值 10 和 -10。我'

4

1 回答 1

2

您一次更新每个 boid。一些小人在他们有机会之前就看到其他人移动了。这意味着他们从来没有像其他人看到他们那样近距离地看到对方。这就是不对称的根源。

问题在于何时将分离调用的结果应用于 boid 的位置。

您需要同时更新所有职位。也就是说,您需要在更新位置以响应排斥力之前完成所有分离调用。


像这样想我有两个变量

a = 1
b = 1

我想将它们中的每一个添加到另一个。如果我做:

a += b
b += a

我得到:

a == 2
b == 3

这不是我想要的。

我希望他们俩都是2

如果我这样做,而不是这样:

(a, b) = (a + b, b + a)

我得到了我想要的。

现在这个花哨的表达隐藏了一个事实。它可以写成没有 as 来显示这一点。

a_ = a + b
b_ = b + a

a = a_
b = b_
于 2021-09-12T07:17:25.820 回答