首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >相互碰撞的物体

相互碰撞的物体
EN

Stack Overflow用户
提问于 2013-05-01 06:07:59
回答 2查看 1.3K关注 0票数 2

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

链接中的伪代码:

代码语言:javascript
复制
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

我的代码是:

代码语言:javascript
复制
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);
}

使用

代码语言:javascript
复制
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));
}

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

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

代码语言:javascript
复制
    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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-01 06:15:11

规则并不是说小行星不能碰撞。他们就是不想。:)

正如您在下面的代码片段中所看到的:

代码语言:javascript
复制
    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

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

也就是说,如果你在多个物体上得到完全相同的位置,这仍然是不太可能的。它会指向一个编程错误。

票数 3
EN

Stack Overflow用户

发布于 2013-05-01 06:33:34

在这篇文章的后面,他有这样的代码:

代码语言:javascript
复制
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是一个名称不佳的规则,使得boids试图彼此避开,那么只需增加m1的值,它们就会更快地远离彼此。此外,增加MIN_DIST将使它们注意到它们即将更快地相撞,而降低它们的最大速度(函数limit_velocity中的vlim)将允许它们对近距离碰撞做出更理智的反应。

正如其他人提到的,没有什么是百分之百保证冲突不发生的,但这些调整将减少冲突发生的可能性。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16309775

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档