python - 在Python中同时检查列表中的所有项目

标签 python

我正在尝试创建一群“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/

相关文章:

python - 如何从 Pandas 中的 m8[ns] 对象中获取小时数?

python:使用列表切片作为for循环的目标

python - 在 Python 中使用列表理解在嵌套 for 循环中枚举

python - 在 matplotlib 中使用边距自动缩放

python - Pandas:如何使用plotly作为后端根据日期绘制多条线?

python - 如何在 TensorFlow 中应用渐变裁剪?

python - time.get_clock_info().resolution 的含义

Python NumPy : reshape is deprecated

python - 如何覆盖模板中的 ArrayField 默认错误消息?

python - 需要建议使用 python 脚本从 ssh 服务器获取 git 克隆工作