我正在尝试创建一群“boids”,并且在最初创建 boids 期间,不得在障碍物上创建它们。然而,它们仍然必须是随机创建的,障碍也是如此。
所以我随机创建了它们,然后检查它们的位置并在需要时更正它们。这似乎在大多数情况下都有效,但我认为正在发生的情况是,如果机器人 1 放置在障碍物 1 上,它会移离障碍物 1,但它可能会落在障碍物 2 上。好吧,当它移动时,它可能会移回到障碍物 2 上。障碍1,不再检查。我怎样才能阻止这种情况发生?
这是创建代码:
def create_boids(self):
for boid in range(self.flock_number): # add the specified number of boids to our flock within our screen's region.
self.boids.append(Boid(random.randint(self.region[0], self.region[2]), random.randint(self.region[1], self.region[3])))
for boid in self.boids: # adjust our boids so they are not created on top of an obstacle and are within our screen's region.
for obstacle in self.obstacles:
while colliding(boid.pos[0], boid.pos[1], boid.radius, obstacle[0][0], obstacle[0][1], obstacle[1]):
boid.pos[0] = random.randint(self.region[0], self.region[2])
boid.pos[1] = random.randint(self.region[1], self.region[3])
self.region = (x, y, width, height)
obstacle in self.obstacles = ((x, y), radius)
这也是碰撞检查。
def colliding(c1x, c1y, c1r, c2x, c2y, c2r):
if (int(c1x) - int(c2x)) ** 2 + (int(c1y) - int(c2y)) ** 2 <= (int(c1r) + int(c2r)) ** 2:
return True
return False
我不知道在这里要尝试什么。感谢您对我的帮助!
最佳答案
有一个函数可以检查主体是否与任何障碍物发生碰撞......并持续选择新位置:
def is_boid_colliding_with_obstacles(self, boid):
return any(colliding(boid.pos[0], boid.pos[1], boid.radius,
obstacle[0][0], obstacle[0][1], obstacle[1])
for obstacle in self.obstacles)
def create_boids(self):
for boid in range(self.flock_number): # add the specified number of boids to our flock within our screen's region.
self.boids.append(Boid(random.randint(self.region[0], self.region[2]), random.randint(self.region[1], self.region[3])))
for boid in self.boids: # adjust our boids so they are not created on top of an obstacle and are within our screen's region.
while self.is_boid_colliding_with_obstacles(boid):
boid.pos[0] = random.randint(self.region[0], self.region[2])
boid.pos[1] = random.randint(self.region[1], self.region[3])
或者,更好的是,首先只生成有效的 boids:
def is_boid_colliding_with_obstacles(self, boid):
return any(colliding(boid.pos[0], boid.pos[1], boid.radius,
obstacle[0][0], obstacle[0][1], obstacle[1])
for obstacle in self.obstacles)
def create_boid(self):
while True:
boid = Boid(random.randint(self.region[0], self.region[2]),
random.randint(self.region[1], self.region[3]))
if not self.is_boid_colliding_with_obstacles(boid):
return boid
def create_boids(self):
self.boids.extend(self.create_boid() for _ in range(self.flock_number))
关于python - 在Python中同时检查列表中的所有项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35399241/