algorithm - 了解速度并实现 Boids 算法?

标签 algorithm data-structures vector vectormath boids

所以我正在努力将 Boids 移植到 Brightscript,基于 pseudocode here .

我正在尝试了解所涉及的数据结构,例如 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_add , vector_sub , vector_div , 和向量 bool 函数。

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

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

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

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

最佳答案

速度

如果你看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

辅助功能部分,它还说:

... all the additions and subtractions in the above pseudocode are vector operations

所以我们可以假设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 伪代码,但您的数据结构看起来是正确的。

关于algorithm - 了解速度并实现 Boids 算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13002603/

相关文章:

language-agnostic - 列表字典有更正式的术语或名称吗?

algorithm - 使用递归查找数组中的第二大元素

c++ - boost :任意分布的 vector

javascript - for...in 在 JavaScript 中是如何实现的?

algorithm - 通过平铺三角形分割任意多边形

javascript - 在 Javascript 或 jQuery 中计算 3 个相似大小的组

data-structures - 将非类型化 Lisp 数据映射为类型化二进制格式以用于编译函数

c++ - 在 vector 中仅对类的一个成员进行排序,而其他成员则保持不变

c++ - obj vector 到成员函数

c - 使用凯撒密码加密文本