def count_strike_point(env): opponent_player = shortcuts.opponent_player(env) # uu = Unit(0,0,0,opponent_player.net_front, env.game.goal_net_top + env.game.goal_net_height, 0,0,0,0) # geometry.rad_to_degree(uu.get_angle_to(env.game.rink_left / 2. + env.game.rink_right /2. , env.game.rink_top)) # import ipdb; ipdb.set_trace() return geometry.ray_interval_intersection_v2( geometry.Point(opponent_player.net_front, env.game.goal_net_top + env.game.goal_net_height), geometry.Point(math.cos(geometry.degree_to_rad(-150)), math.sin(geometry.degree_to_rad(-150))), geometry.Point(0, env.game.goal_net_top - 100), geometry.Point(world.width, env.game.goal_net_top - 100), )
def puck_is_heading_to_my_net(env): player = shortcuts.my_player(env) pbegin = geometry.Point( player.net_front, env.game.rink_top ) pend = geometry.Point( player.net_front, env.game.rink_bottom ) intersection = geometry.ray_interval_intersection_v2( env.world.puck, geometry.Point( env.world.puck.speed_x, env.world.puck.speed_y ), pbegin, pend ) if intersection is None: return False angle = geometry.ray_ray_angle( env.world.puck, intersection, geometry.Point( player.net_front, env.game.rink_top )) if abs(geometry.degree_to_rad(90) - angle) < geometry.degree_to_rad(20): return False if intersection.y < player.net_top: return (player.net_top - intersection.y) < 10 if intersection.y > player.net_bottom: return (intersection.y - player.net_bottom) < 10 return abs(intersection.y - player.net_top) < 50 or abs(intersection.y - player.net_bottom) < 50
def count_attack_polygon( env, player, is_down, angle_min, angle_max, rink_margin, middle_margin): is_left = shortcuts.player_left(env, player) left_sign = shortcuts.player_left_sign(env, player) left_sign = 1 if is_left else -1 # down_sign = 1 - нижняя половина down_sign = 1 if is_down else -1. if is_down: corner_y = player.net_top else: corner_y = player.net_bottom corner = geometry.Point( player.net_front, corner_y) # attack_y_min - линия ближе к границе # attack_y_max - линия ближе к воротам if is_down: attack_y_min = env.game.rink_bottom - rink_margin else: attack_y_min = env.game.rink_top + rink_margin if is_down: attack_y_max = player.net_bottom - shortcuts.goalie_radius() - middle_margin else: attack_y_max = player.net_top + shortcuts.goalie_radius() + middle_margin attack_x_min = env.game.rink_left attack_x_max = env.game.rink_right angle_sign = left_sign * down_sign if is_left: angle_shift = 0. else: angle_shift = geometry.degree_to_rad(180) p1 = geometry.ray_interval_intersection_v2( corner, geometry.angle_vector(angle_sign * angle_min + angle_shift, 1), geometry.Point(attack_x_min, attack_y_max), geometry.Point(attack_x_max, attack_y_max) ) p2 = geometry.ray_interval_intersection_v2( corner, geometry.angle_vector(angle_sign * angle_min + angle_shift, 1), geometry.Point(attack_x_min, attack_y_min), geometry.Point(attack_x_max, attack_y_min) ) p3 = geometry.ray_interval_intersection_v2( corner, geometry.angle_vector(angle_sign * angle_max + angle_shift, 1), geometry.Point(attack_x_min, attack_y_min), geometry.Point(attack_x_max, attack_y_min) ) p4 = geometry.ray_interval_intersection_v2( corner, geometry.angle_vector(angle_sign * angle_max + angle_shift, 1), geometry.Point(attack_x_min, attack_y_max), geometry.Point(attack_x_max, attack_y_max) ) return geometry.Polygon([p1, p2, p3, p4])
def count_attack_polygons(env, player): is_left = shortcuts.player_left(env, player) left_sign = shortcuts.player_left_sign(env, player) left_sign = 1 if is_left else -1 angle_min = geometry.degree_to_rad(37) angle_max = geometry.degree_to_rad(53) polygons = [] # down_sign = 1 - нижняя половина for down_sign in (-1, 1): is_down = down_sign > 0 if is_down: corner_y = player.net_top else: corner_y = player.net_bottom corner = geometry.Point( player.net_front, corner_y) # attack_y_min - линия ближе к границе # attack_y_max - линия ближе к воротам if is_down: attack_y_min = env.game.rink_bottom - 30 else: attack_y_min = env.game.rink_top + 30 if is_down: attack_y_max = player.net_bottom - shortcuts.goalie_radius() - 30 else: attack_y_max = player.net_top + shortcuts.goalie_radius() + 30 attack_x_min = env.game.rink_left attack_x_max = env.game.rink_right angle_sign = left_sign * down_sign if is_left: angle_shift = 0. else: angle_shift = geometry.degree_to_rad(180) p1 = geometry.ray_interval_intersection_v2( corner, geometry.angle_vector(angle_sign * angle_min + angle_shift, 1), geometry.Point(attack_x_min, attack_y_max), geometry.Point(attack_x_max, attack_y_max) ) p2 = geometry.ray_interval_intersection_v2( corner, geometry.angle_vector(angle_sign * angle_min + angle_shift, 1), geometry.Point(attack_x_min, attack_y_min), geometry.Point(attack_x_max, attack_y_min) ) p3 = geometry.ray_interval_intersection_v2( corner, geometry.angle_vector(angle_sign * angle_max + angle_shift, 1), geometry.Point(attack_x_min, attack_y_min), geometry.Point(attack_x_max, attack_y_min) ) p4 = geometry.ray_interval_intersection_v2( corner, geometry.angle_vector(angle_sign * angle_max + angle_shift, 1), geometry.Point(attack_x_min, attack_y_max), geometry.Point(attack_x_max, attack_y_max) ) polygons.append(geometry.Polygon([p1, p2, p3, p4])) return polygons