2

编程新手,对于我的第一个项目之一,我正在跟踪一个用于 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))))

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

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

它是否为单独计算的球体速度提供了参考范围?

4

2 回答 2

1

TL;博士

angles是一组随机方向。cos并将sin指向这些方向的单位向量分解为它们的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)

Step 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


编辑

为了详细说明我关于使用sinand cosfor xand的观点y,这里有一张图片。

罪与因

最上面一行显示了小角度 (0 < theta< π / 4) 的速度矢量,在这种情况下交换sincos产生差异,您必须小心跟踪如何测量角度。

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

于 2016-04-22T17:45:38.217 回答
0

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

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

在 Processing的这个实现中也会发生同样的情况。

于 2016-04-22T17:14:04.047 回答