【问题标题】:Understanding velocity and implementing Boids algorithm?了解速度并实施 Boids 算法?
【发布时间】:2012-10-21 21:59:01
【问题描述】:

所以我正在根据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 和向量布尔函数。

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

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

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

如果b.position - b[j].position都是3D坐标,除非是&lt; {100,100,100},否则怎么算“小于100”?

【问题讨论】:

    标签: algorithm data-structures vector vectormath boids


    【解决方案1】:

    速度

    如果您查看 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| = sqrt(x1^2 + ... + xn^2) 在欧几里得空间中为向量v 定义。

    所以,对于你的 3D 矢量diffB

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

    由于平方根的结果是一个标量,显然可以满足&lt; 100


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

    【讨论】:

    • 所以你是说从另一个向量中减去一个向量得到一个值,实际操作是将每个坐标值的平方根加到二次方?
    【解决方案2】:

    这里的表达式是什么:

    |b.position - bJ.position|
    

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

    这个标量是一个单一的值,因此可以是

    【讨论】:

    • 如果 b.position={x:100,y:123,z:300} 和 b[j].position={x:150,y:300,z:220} 你会怎么做两组值相减得到一个值?
    猜你喜欢
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 1970-01-01
    • 2022-10-06
    • 2010-12-26
    相关资源
    最近更新 更多