def test_interval_intersection(self): for args, answer in [ ((0, 0, 0, 1, 0, 0, 1, 0), True), ((0, 0.5, 0, 1, 0.5, 0, 1, 0), False), ((0, 1, 1, 0, 0, 0, 1, 1), True), ((0, 1, 0.25, 0.75, 0, 0, 1, 1), False), ((0, 0, 1, 1, 0, 1, 1, 1.0004), False), ((0, 0, 1, 1, 0, 1, 1, 0.999), True), ((0, 0, 1, 1, 0, 1, 0.99, 1), False), ((0, 0, 0, 1, 1, 0, 1, 1), False), ]: self.assertEqual( geometry.are_intervals_intersect(*args), answer )
def cross_boundaries(tank, world): tank_borders = utils.get_borders(tank) for world_border in utils.get_world_borders(): for tank_border in tank_borders: x1, y1, x2, y2 = tank_border if geometry.are_intervals_intersect(x1, y1, x2, y2, *world_border): return True def can_cross(unit): unit_size = math.hypot(unit.width / 2., unit.height / 2.) tank_size = math.hypot(tank.width / 2., tank.height / 2.) return unit_size + tank_size > math.hypot(unit.x - tank.x, unit.y - tank.y) # for unit in world.obstacles: # for unit in world.obstacles + utils.other_tanks(world, tank): for unit in filter(lambda u: can_cross(u), world.obstacles + utils.other_tanks(world, tank)): for border in utils.get_borders(unit): for tank_border in tank_borders: x1, y1, x2, y2 = tank_border if geometry.are_intervals_intersect(x1, y1, x2, y2, *border): return True return False