gpt4 book ai didi

c++ - 机器人相互碰撞

转载 作者:搜寻专家 更新时间:2023-10-31 00:39:21 26 4
gpt4 key购买 nike

我正在查看 boids 的一些伪代码并用 C++ 编写。但是,我发现类群偶尔会相互碰撞。考虑到伪代码的简单性,我认为我的编程是正确的。然而,当我显示所有 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

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

最佳答案

规则并没有说类群不能发生碰撞。他们只是不想。 :)

如您在此片段中所见:

    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

没有检查来确保它们不会发生碰撞。如果结果不尽如人意,它们仍会发生冲突。

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

关于c++ - 机器人相互碰撞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16309775/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com