在 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,即使它们朝着所有可能的方向前进。
TL;DR
angles
是一组随机方向。 cos
和 sin
将指向这些方向的单位向量分解为其 x
和 y
分量。
更长的解释
此代码段初始化 N
单位速度 向量 指向随机方向。最合乎逻辑(也是最简单)的方法是
- 初始化
N
个均匀分布在0和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
.
编辑
为了详细说明我关于将 sin
和 cos
用于 x
和 y
的观点,这里有一张图片。
顶行显示小角度 (0 < theta
< π / 4) 的速度矢量,在这种情况下交换 sin
和 cos
会有所不同,你有要小心跟踪您要如何测量角度。
最后一行显示了均匀随机角度的速度矢量,其中交换坐标使结果看起来非常相似。
编程新手,对于我的第一个项目之一,我正在遵循 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,即使它们朝着所有可能的方向前进。
TL;DR
angles
是一组随机方向。 cos
和 sin
将指向这些方向的单位向量分解为其 x
和 y
分量。
更长的解释
此代码段初始化 N
单位速度 向量 指向随机方向。最合乎逻辑(也是最简单)的方法是
- 初始化
N
个均匀分布在0和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
.
编辑
为了详细说明我关于将 sin
和 cos
用于 x
和 y
的观点,这里有一张图片。
顶行显示小角度 (0 < theta
< π / 4) 的速度矢量,在这种情况下交换 sin
和 cos
会有所不同,你有要小心跟踪您要如何测量角度。
最后一行显示了均匀随机角度的速度矢量,其中交换坐标使结果看起来非常相似。