了解速度和实现Boids算法?

时间:2012-10-21 21:59:02

标签: algorithm data-structures vector vectormath boids

所以我正在根据pseudocode here将Boids移植到Brightscript。

我正在尝试理解所涉及的数据结构,例如Velocity是单个值,还是3D值? (即velocity={x,y,z}

似乎伪代码似乎混淆了这一点,有时它有一个包含向量和单值项的方程:

v1 = rule1(b)
v2 = rule2(b)
v3 = rule3(b)

b.velocity = b.velocity + v1 + v2 + v3

如果Velocity是三方价值,那么这是有道理的,但我不确定。

所以,我的第一个问题:基于上面的伪代码,这是单个boid的正确数据结构吗?

boid={position:{px:0,py:0,pz:0},velocity:{x:0,y:0,z:0},vector:{x:0,y:0,z:0},pc:{x:0,y:0,z:0},pv:{x:0,y:0,z:0})

其中pc =感知中心,pv =感知速度。

我已经实现了vector_addvector_subvector_div和向量布尔函数。

我从这个伪代码开始的原因是我无法找到任何其他可读的东西,但由于没有为每个变量明确定义数据结构,它仍然留下了很多问题。 / p>

(编辑)这是我正在谈论的一个很好的例子:

IF |b.position - bJ.position| < 100 THEN

如果b.position - b[j].position都是3D坐标,那么它们如何被视为“小于100”,除非它们是< {100,100,100}

2 个答案:

答案 0 :(得分:3)

速度

如果你看their pseudocode进行矢量加法和减法,它们就是在三维向量上明确地执行这些操作,例如

PROCEDURE Vector_Add(Vector v1, Vector v2)
    Vector v
    v.x = v1.x + v2.x
    v.y = v1.y + v2.y
    v.z = v1.z + v2.z
    RETURN v
END PROCEDURE

辅助功能部分,它还说:

  

...上述伪代码中的所有加法和减法都是   矢量运算

因此我们可以假设b.velocity = b.velocity + v1 + v2 + v3 + ...是3D矢量的矢量加法。

矢量幅度

两个向量的减法称为向量之间的差异,并产生一个新向量。在您的情况下,请diffB = b.position - bJ.position

现在|b.position - bJ.position|相当于|diffB|,并且取差异向量diffB的幅度,而不是“单值”的绝对值 (称为标量。)幅度也称为矢量长度或标准。

可能令人困惑的是,矢量的大小用与绝对值相同的符号表示。因此diffB是差异向量,|diffB|是该向量的大小。通过v在欧几里得空间中为矢量|v| = sqrt(x1^2 + ... + xn^2)定义幅度。

因此,对于您的3D矢量diffB

|diffB| = sqrt(x1^2 + x2^2 + x3^2) = sqrt(x^2 + y^2 + z^2)

由于平方根的结果是标量,它可以清楚地满足< 100


所以是的,我相信速度是一个3D矢量velocity = {x1, x2, x3},虽然我还没有彻底检查过boid伪代码,但你的数据结构看似正确。

答案 1 :(得分:1)

这里的表达是什么:

|b.position - bJ.position|

实际上是两个向量差异的标量。

该标量是单个值,因此可以是&lt; 100。