植绒行为问题

昨天我遇到了Craig Reynolds的Boids ,随后我发现我将用Java实现一个简单的2D版本。 我已经根据康拉德帕克的笔记制作了一个相当基本的设置。

但是,我得到了一些相当离奇的(在我看来)行为。 目前,我的boids合理地快速移动到粗糙的网格或格子中,然后在现场进行抽搐。 我的意思是他们移动一点并且非常频繁地旋转。

目前,我已实施:

  1. 对准
  2. 凝聚
  3. 分割
  4. 速度限制

最初,我的boids随机分布在屏幕区域(与Parker的方法略有不同),它们的速度都指向屏幕区域的中心(注意随机初始化的速度给出相同的结果)。 更改速度限制值只会改变boids进入此模式的速度,而不是形成模式。

在我看来,这可能是:

  1. 我正在使用的参数的结果(现在我的代码如Parker的伪代码所述;我还没有尝试过Reynolds所描述的由角度和半径定义的影响区域。)
  2. 我需要实现的东西,但我不知道。
  3. 我做错了什么。

预期的行为将更像雷诺兹的boids页面上applet中发生的二维版本,尽管现在我还没有实现任何方法来保持屏幕上的boid。

有没有人遇到过这个? 有关原因和/或如何解决的任何想法? 如果它有帮助,我可以发布一个.gif的行为。

也许你对分离规则的权重过于强烈,导致所有的boids尽可能远离所有相邻的boids。 我的伪代码中有各种常量作为权重:规则1中的/ 100和规则3中的/ 8(规则2中的隐含* 1); 这些可以调整,这通常可用于建模不同的行为,如紧密蜂拥或昆虫。

也是任意的|距离| 应修改分离规则中的<100以匹配模拟的单位; 此规则应仅适用于近距离的boids,基本上是为了避免碰撞。

玩的开心!

如果他们看到每个人,他们都会试图以平均速度移动。 如果他们只看到一些可能会有一些分离的群体。

如果它们是随机分布的,它将接近于零。

如果你用长方形来限制它们,或者要么将它们从墙壁上排斥,或者当它们靠近时将它们传送到另一侧并且分离得太高,它们将被推离墙壁(从墙壁本身或其他刚刚被传送的人,那么他们将被推到另一边(并推动并再次推动))。

因此,尝试更紧密的凝聚力,有限的视线,更多的空间并将它们分布成聚集(挑选随机点并将它们的多个随机距离放置在那里),不均匀或正常。

我也遇到了这个问题。 我通过确保更新每个boid的速度的方法将新速度添加到旧速度而不是重置它来解决它。 从本质上讲,正在发生的事情是:这些人正在试图远离彼此而不能加速(因为他们的速度正在被重置而不是增加,因为他们应该),因此“抽搐”。 您更新速度的方法应如下所示

def set_velocity(self, dxdy): self.velocity = (self.velocity[0] + dxdy[0], self.velocity[1] + dxdy[1]) 

其中velocity和dxdy是2元组。

我想知道你是否有碰撞矩形的问题。 如果你实现了基于重叠矩形的东西(比如说, 这个 ),当两个矩形足够接近任何移动导致它们相交时,你可以得到你描述的行为。 (或者更糟糕的是,如果一个矩形可以完全在另一个矩形内部。)

解决这个问题的一个方法是确保每个boid只向前看。 然后你避免A不能移动的情况,因为B在前面太靠近,但B不能移动,因为A太靠近了。

快速检查是实际绘制所有碰撞矩形,并将任何相交的矩形颜色为不同颜色。 它经常给出停止和抽搐原因的线索。

Interesting Posts