在boid模拟中定义速度

时间:2016-04-22 16:51:10

标签: python boids

编程新手,对于我的第一个项目之一,我正在遵循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函数正在做什么?

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

2 个答案:

答案 0 :(得分:1)

<强> TL; DR

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

更长的解释

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

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

    x = cos(theta)
    y = sin(theta)
    
  3. 步骤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的观点,这是一张图片。

    sin vs. cos

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

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

答案 1 :(得分:0)

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

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

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