在boid模拟中定义速度

2024-09-27 04:09:05 发布

您现在位置:Python中文网/ 问答频道 /正文

新的编程,我的第一个项目之一,我遵循一个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设置随机向量,但是为什么随机角度本身就不够?在

对于单位速度的定义,正弦函数和余弦函数的作用是什么?在

它是否为单独计算的boid速度提供了参考条件?在


Tags: of项目函数代码编程nppimath
2条回答

TL;DR

angles是一个随机方向的数组。cossin将指向这些方向的单位向量分解为它们的x和{}分量。在

更长的解释

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

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

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

第1步。完成

^{pr2}$

第二步。可以分解为

# 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对象,没有中间的Pythonlist。在


编辑

这是一个关于cd2的点。在

sin vs. cos

最上面一行显示了小角度(0<;theta<;π/4)的速度矢量,在这种情况下,sin和{}的交换会有所不同,您必须小心地跟踪您要如何测量角度。在

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

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

在这段代码中(类似于示例实现here),每个Boid的初始速度是1,尽管它们朝着每个可能的方向发展。在

同样的情况发生在this implementation in Processing。在

相关问题 更多 >

    热门问题