编程新手,对于我的第一个项目之一,我正在遵循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函数正在做什么?
它是否为单独计算的速度提供了参考条件?
答案 0 :(得分: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
&lt;π/ 4),在这种情况下,交换sin
和cos
会有所不同,你有要小心跟踪你想要如何测量角度。
底行显示均匀随机角度的速度向量,其中交换坐标使结果看起来非常相似。
答案 1 :(得分:0)
在这种情况下,速度不仅仅是(标量)速度。它是一个矢量,因此它描述了方向和速度。然后,单位/秒的实际速度是速度矢量的长度。
似乎在这段代码中(类似于示例实现here),每个Boid的初始速度为1,即使它们朝着每个可能的方向前进。
同样的情况发生在this implementation in Processing。