在 boid 模拟中定义速度

Defining velocity in a boid simulation

编程新手,对于我的第一个项目之一,我正在遵循 boid 模拟的代码,但我不确定这部分代码中的 sin 和 cos 函数在做什么。

N = numer of boids

angles = 2*math.pi*np.random.rand(N)

vel = np.array(list(zip(np.sin(angles), np.cos(angles))))

一般来说,代码是为 boid 设置随机向量,但为什么随机角度本身还不够?

sin 和 cos 函数的作用是什么,这对单位速度的定义很重要?

它是否提供了单独计算的类群速度的参考范围?

在这种情况下,速度不仅仅是(标量)速度。它是一个向量,因此它同时描述了方向和速度。 units/sec中的实际速度就是速度矢量的长度。

似乎在此代码中(类似于示例实现 here)每个 Boid 的初始速度都是 1,即使它们朝着所有可能的方向前进。

this implementation in Processing也是如此。

TL;DR

angles是一组随机方向。 cossin 将指向这些方向的单位向量分解为其 xy 分量。

更长的解释

此代码段初始化 N 单位速度 向量 指向随机方向。最合乎逻辑(也是最简单)的方法是

  1. 初始化N个均匀分布在0和2π之间的随机角度,并且
  2. 对于每个角度theta,将单位向量(1, theta)从极坐标转换为笛卡尔坐标,转换为

    x = cos(theta)
    y = sin(theta)
    

第 1 步完成

angles = 2 * math.pi * np.random.rand(N)

步骤2.可以分解为

# arrays of x- and y-coordinates
velx = np.cos(angles)
vely = np.sin(angles)

# create (x, y) pairs and convert to np.array
vel = np.array(list(zip(velx, vely)))

请注意,在您的代码中,np.sin(angles) 用作 x 坐标,这并不严格正确,但这并不重要,因为角度是随机且均匀的。


仅供参考,另一种创建 (x, y) 对的方法是

vel = np.vstack([velx, vely]).T

这要快得多,因为它专门处理 Numpy 对象,没有中间 Python list.


编辑

为了详细说明我关于将 sincos 用于 xy 的观点,这里有一张图片。

顶行显示小角度 (0 < theta < π / 4) 的速度矢量,在这种情况下交换 sincos 会有所不同,你有要小心跟踪您要如何测量角度。

最后一行显示了均匀随机角度的速度矢量,其中交换坐标使结果看起来非常相似。