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