了解速度并实现 Boids 算法?



所以我正在努力将Boids移植到Brightscript,基于这里的伪代码。

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

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

v1 = rule1(b)
v2 = rule2(b)
v3 = rule3(b)
b.velocity = b.velocity + v1 + v2 + v3

如果速度是一个三方值,那么这是有道理的,但我不确定。

所以,我的第一个问题:基于上面的伪代码,这是单个 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和向量布尔函数。

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

(编辑)这是我所说的一个很好的例子:

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

如果b.position - b[j].position都是3D坐标,除非它们< {100,100,100},否则它们怎么能被认为是"小于100"?

速度

如果你查看他们的伪代码的向量加法和减法,他们会在三维向量上显式执行这些操作,例如

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 伪代码,但您的数据结构似乎是正确的。

这里的表达式是什么:

|b.position - bJ.position|

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

此标量是单个值,因此可以<100。

相关内容

  • 没有找到相关文章

最新更新