【问题标题】:Boids colliding with each otherBoids相互碰撞
【发布时间】:2013-04-24 22:57:40
【问题描述】:

我正在查看boids 的一些伪代码,并用 C++ 编写了它。但是,我发现 boid 偶尔会相互碰撞。考虑到伪代码的简单程度,我认为我已经正确编程了它。然而,当我显示所有 boid 的位置时,其中一些具有相同的坐标。

链接中的伪代码:

PROCEDURE rule2(boid bJ)

    Vector c = 0;

    FOR EACH BOID b
        IF b != bJ THEN
            IF |b.position - bJ.position| < 100 THEN
                c = c - (b.position - bJ.position)
            END IF
        END IF
    END

    RETURN c

END PROCEDURE

我的代码是:

std::pair <signed int, signed int> keep_distance(std::vector <Boid> & boids, Boid & boid){
    signed int dx = 0;
    signed int dy = 0;
    for(Boid & b : boids){
        if (boid != b){       // this checks an "id" number, not location
            if (b.dist(boid) < MIN_DIST){
                dx -= b.get_x() - boid.get_x();
                dy -= b.get_y() - boid.get_y();
            }
        }
    }
    return std::pair <signed int, signed int> (dx, dy);
}

MIN_DIST = 100;

unsigned int Boid::dist(const Boid & b){
    return (unsigned int) sqrt((b.x - x) * (b.x - x) + (b.y - y) * (b.y - y));
}

这两个代码之间唯一的主要区别应该是我使用组件而不是vector c

我用来移动每个 boid 的函数顺序是:

    center_of_mass(boids, new_boids[i]);                      // rule 1
    match_velocity(boids, new_boids[i]);                      // rule 3
    keep_within_bound(new_boids[i]);
    tendency_towards_place(new_boids[i], mouse_x, mouse_y); 
    keep_distance(boids, new_boids[i]);                       // rule 2

有什么我没有看到的明显的东西吗?也许我做错了一些愚蠢的向量算术?

【问题讨论】:

  • int 是默认签名的,所以你可以写int 而不是signed int 如果你愿意。
  • 这真的没有帮助

标签: c++ c++11 simulation boids


【解决方案1】:

规则并没有说 boids 不能碰撞。他们只是不想。 :)

正如你在这个 sn-p 中看到的那样:

    FOR EACH BOID b
        v1 = rule1(b)
        v2 = rule2(b)
        v3 = rule3(b)

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

没有检查以确保它们不会发生碰撞。如果结果不利,它们仍然会发生冲突。

话虽如此,但如果您为多个 boid 获得完全相同的位置,那么仍然不太可能。它会指向一个编程错误。

【讨论】:

  • 我认为我在任何时间步最多只能看到 2 个 boids 碰撞
  • 是的,但是如何定义碰撞?如果您正在进行浮点运算,两次获得完全相同的值是非常不可能的。哦,你正在使用整数。不理我! :D
  • 哦。我使用具有整数值的像素。我应该把它们改成花车吗?
  • 您不必这样做,但在这种情况下,碰撞完全没问题。
【解决方案2】:

在文章后面他有这个代码:

ROCEDURE move_all_boids_to_new_positions()
    Vector v1, v2, v3, ...
    Integer m1, m2, m3, ...
    Boid b
    FOR EACH BOID b
        v1 = m1 * rule1(b)
        v2 = m2 * rule2(b)
        v3 = m3 * rule3(b)
        b.velocity = b.velocity + v1 + v2 + v3 + ...
        b.position = b.position + b.velocity
    END
END PROCEDURE

(虽然实际上我会让 m1 成为 double 而不是 Integer)如果 rule1 是一个名称不佳的规则,它使 boid 试图相互避开,只需增加 m1 的值,它们就会彼此转得更快。此外,增加MIN_DIST 将使他们注意到他们将更快地撞到彼此,而降低他们的最大速度(limit_velocity 函数中的vlim)将使他们对附近的碰撞做出更明智的反应。

正如其他人所提到的,没有什么可以 100% 保证不会发生碰撞,但这些调整会降低碰撞的可能性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2019-03-27
    • 2015-07-26
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2019-11-11
    • 2019-04-30
    相关资源
    最近更新 更多