Exemplo n.º 1
0
 def get_angle():
     vgx = math.cos(goal.angle)
     vgy = math.sin(goal.angle)
     vsx = goal.x - me.x
     vsy = goal.y - me.y
     angle = geometry.get_angle(vgx, vgy, vsx, vsy)
     return angle if angle < math.pi / 2. else math.pi - angle
Exemplo n.º 2
0
def shell_damage(shell, tank):
    '''return health damage'''
    pessimistic_tank = copy(tank)
    pessimistic_tank.width *= 1.1
    pessimistic_tank.height *= 1.1
    front, right, back, left = utils.get_borders(pessimistic_tank)
    # front, right, back, left = utils.get_borders(tank)

    next_shell_x = shell.x + shell.speedX * 1000.
    next_shell_y = shell.y + shell.speedY * 1000.

    borders_with_intersections = [(b,
            geometry.intervals_intersection(
                    b[0], b[1], b[2], b[3], shell.x, shell.y, next_shell_x, next_shell_y)) for
            b in front, right, back, left]

    borders_with_intersections = filter(lambda bi: bi[1] is not None, borders_with_intersections)
    if not borders_with_intersections:
        return 0.
    border, intersection_point = min(borders_with_intersections,
            key=lambda b: math.hypot(b[1][0] - shell.x, b[1][1] - shell.y))

    angle = geometry.get_angle(border[0] - border[2], border[1] - border[3], shell.speedX, shell.speedY)
    if angle > math.pi / 2:
        angle = math.pi - angle
    angle = math.pi / 2. - angle

    r1 = math.hypot(border[0] - intersection_point[0], border[1] - intersection_point[1])
    r2 = math.hypot(border[2] - intersection_point[0], border[3] - intersection_point[1])
    r = r1 + r2
    dist_factor = (r - 2. * min(r1, r2)) / r

    return coeff_by_angle(shell, geometry.rad_to_degree(angle)) * coeff_by_dist_factor(dist_factor)
Exemplo n.º 3
0
def do_stop(env):
    speed_abs = geometry.vector_abs(env.me.speed_x, env.me.speed_y)
    angle = geometry.get_angle(
        math.cos(env.me.angle), math.sin(env.me.angle),
        env.me.speed_x, env.me.speed_y)
    if abs(geometry.rad_to_degree(angle)) < 90:
        env.move.turn = angle
        env.move.speed_up = -min(1., speed_abs / env.game.hockeyist_speed_down_factor)
    else:
        env.move.turn = -angle
        env.move.speed_up = min(1., speed_abs / env.game.hockeyist_speed_up_factor)
Exemplo n.º 4
0
    def count_damage(goal, enemy):
        if abs(geometry.get_angle(
                enemy.x - me.x, enemy.y - me.y, enemy.x - goal.x, enemy.y - goal.y)) < math.pi / 2:
            x, y = goal.x, goal.y
        else:
            # FIXME more correct here cause me and goal is not equivalent here
            x, y = geometry.get_nearest_point(me.x, me.y, goal.x, goal.y, enemy.x, enemy.y)

        goal_damage = damage_probability(enemy.x, enemy.y, x, y)
        for e in enemies + teammates:
            if utils.is_teammate(e, enemy):
                continue
            if damage_probability(enemy.x, enemy.y, e.x, e.y) > goal_damage:
                return 0.
        return goal_damage
Exemplo n.º 5
0
    def bulge_coords(self, x0, y0, x1, y1, bulge, tol_deg=20):

        # global Zero

        bcoords = []
        if bulge < 0.0:
            sign = 1
            bulge = abs(bulge)
            # bcoords.append([x0,y0,x1,y1])
            # return bcoords
        else:
            sign = -1

        dx = x1 - x0
        dy = y1 - y0
        c = sqrt(dx**2 + dy**2)
        alpha = 2.0 * (atan(bulge))
        R = c / (2 * sin(alpha))
        L = R * cos(alpha)
        steps = ceil(2 * alpha / radians(tol_deg))

        if abs(c) < Zero:
            phi = 0
            bcoords.append([x0, y0, x1, y1])
            return bcoords

        seg_sin = dy / c
        seg_cos = dx / c
        phi = get_angle(seg_sin, seg_cos)

        d_theta = 2 * alpha / steps
        theta = alpha - d_theta

        xa = x0
        ya = y0
        for i in range(1, int(steps)):
            xp = c / 2 - R * sin(theta)
            yp = R * cos(theta) - L
            xb, yb = transform(xp, yp * sign, radians(phi))
            xb = xb + x0
            yb = yb + y0

            bcoords.append([xa, ya, xb, yb])
            xa = xb
            ya = yb
            theta = theta - d_theta
        bcoords.append([xa, ya, x1, y1])
        return bcoords
Exemplo n.º 6
0
    def bulge_coords(self, x0, y0, x1, y1, bulge, tol_deg=20):

        # global Zero

        bcoords = []
        if bulge < 0.0:
            sign = 1
            bulge = abs(bulge)
            # bcoords.append([x0,y0,x1,y1])
            # return bcoords
        else:
            sign = -1

        dx = x1 - x0
        dy = y1 - y0
        c = sqrt(dx ** 2 + dy ** 2)
        alpha = 2.0 * (atan(bulge))
        R = c / (2 * sin(alpha))
        L = R * cos(alpha)
        steps = ceil(2 * alpha / radians(tol_deg))

        if abs(c) < Zero:
            phi = 0
            bcoords.append([x0, y0, x1, y1])
            return bcoords

        seg_sin = dy / c
        seg_cos = dx / c
        phi = get_angle(seg_sin, seg_cos)

        d_theta = 2 * alpha / steps
        theta = alpha - d_theta

        xa = x0
        ya = y0
        for i in range(1, int(steps)):
            xp = c / 2 - R * sin(theta)
            yp = R * cos(theta) - L
            xb, yb = transform(xp, yp * sign, radians(phi))
            xb = xb + x0
            yb = yb + y0

            bcoords.append([xa, ya, xb, yb])
            xa = xb
            ya = yb
            theta = theta - d_theta
        bcoords.append([xa, ya, x1, y1])
        return bcoords
Exemplo n.º 7
0
    def get_attract_field(self, mytank, obj, r, s, a):

        d = get_center_distance(mytank, obj)
        theta = get_angle(mytank, obj)

        dx = 0
        dy = 0

        if d > (s + r):
            dx = a * s * cos(theta)
            dy = a * s * sin(theta)
        elif d >= r:  #and d<=s+r
            dx = a * (d - r) * cos(theta)
            dy = a * (d - r) * sin(theta)
        #else dx = 0 dy = 0

        vector = Vector()
        vector.set_x_and_y(dx, dy)

        return vector
Exemplo n.º 8
0
	def get_attract_field(self, mytank, obj, r, s, a):
		
		d = get_center_distance(mytank, obj)
		theta = get_angle(mytank, obj)
		
		dx = 0;
		dy = 0
		
		if d > (s+r):
			dx = a * s * cos(theta)
			dy = a * s * sin(theta)
		elif d >= r: #and d<=s+r
			dx = a * (d-r) * cos(theta)
			dy = a * (d-r) * sin(theta)
		#else dx = 0 dy = 0
		
		vector = Vector()
		vector.set_x_and_y(dx, dy)
				
		return vector
Exemplo n.º 9
0
    def get_repulse_field(self, mytank, obj, r, s, b):

        d = get_center_distance(mytank, obj)
        theta = get_angle(mytank, obj)

        dx = 0
        dy = 0

        if d < r:
            dx = -sign(cos(theta)) * float('inf')
            dy = -sign(sin(theta)) * float('inf')
        elif d >= r and d <= s + r:
            dx = -b * (s + r - d) * cos(theta)
            dy = -b * (s + r - d) * sin(theta)

        #else dx, dy = 0

        vector = Vector()
        vector.set_x_and_y(dx, dy)

        return vector
Exemplo n.º 10
0
	def get_repulse_field(self, mytank, obj, r, s, b):
		
		d = get_center_distance(mytank, obj)
		theta = get_angle(mytank, obj)
		
		dx = 0
		dy = 0
		
		if d < r:
			dx = -sign(cos(theta))*float('inf')
			dy = -sign(sin(theta))*float('inf')
		elif d >= r and d <= s+r:
			dx = -b * (s + r - d) * cos(theta)
			dy = -b * (s + r - d) * sin(theta)
			
		#else dx, dy = 0
				
		vector = Vector()
		vector.set_x_and_y(dx, dy)
		
		return vector
    def do(self, env):
        speed_abs = geometry.vector_abs(env.me.speed_x, env.me.speed_y)
        if speed_abs < 0.0001:
            self.done = True
            print (
                'tick = ', env.world.tick,
                'Stop done',
                'x = ', env.me.x,
                'y = ', env.me.y,
                'speed abs = ', speed_abs
            )
            return

        angle = geometry.get_angle(
            math.cos(env.me.angle), math.sin(env.me.angle),
            env.me.speed_x, env.me.speed_y)
        if abs(geometry.rad_to_degree(angle)) < 90:
            env.move.turn = angle
            env.move.speed_up = -min(1., speed_abs / env.game.hockeyist_speed_down_factor)
        else:
            env.move.turn = -angle
            env.move.speed_up = min(1., speed_abs / env.game.hockeyist_speed_up_factor)
Exemplo n.º 12
0
def line_arc_fit(lastx, lasty, lastz, x1, y1, z1, nextx, nexty, nextz,
                 FLAG_arc, code, R_last, x_center_last, y_center_last,
                 FLAG_line, accuracy, seg_arc):
    """
    Line fit and arc fit (curve fit)
    """

    # print lastx, lasty, lastz, x1, y1, z1, nextx, nexty, nextz
    # print FLAG_arc, code, R_last, x_center_last, y_center_last, FLAG_line, accuracy

    dx_a = x1 - lastx
    dy_a = y1 - lasty
    dz_a = z1 - lastz

    dx_c = nextx - lastx
    dy_c = nexty - lasty
    dz_c = nextz - lastz

    if abs(dx_a) > Zero:
        line_t = dx_c / dx_a
    elif abs(dy_a) > Zero:
        line_t = dy_c / dy_a
    elif abs(dz_a) > Zero:
        line_t = dz_c / dz_a
    else:
        line_t = 0

    ex = dx_c - dx_a * line_t
    ey = dy_c - dy_a * line_t
    ez = dz_c - dz_a * line_t
    et = sqrt(ex * ex + ey * ey + ez * ez)

    L_a = dx_a * dx_a + dy_a * dy_a + dz_a * dz_a
    L_c = dx_c * dx_c + dy_c * dy_c + dz_c * dz_c

    FLAG_arc_last = FLAG_arc
    FLAG_arc = 0

    FLAG_line_last = FLAG_line
    if et > accuracy or (L_a >= L_c) or FLAG_arc_last == 1:
        FLAG_line = 0
    else:
        FLAG_line = 1
        code = "G1"

    ###############
    # Arc Fitting #
    ###############

    arc_fit = 1

    if (FLAG_line != 1 and FLAG_line_last != 1 and line_t != 0 and arc_fit):
        dx_b = nextx - x1
        dy_b = nexty - y1
        dz_b = nextz - z1
        L_b = dx_b * dx_b + dy_b * dy_b + dz_b * dz_b

        if abs(dx_a) > Zero and abs(dx_b) > Zero:
            ma = dy_a / dx_a
            mb = dy_b / dx_b

            if abs(mb - ma) > Zero and (abs(ma) > Zero or abs(mb) > Zero):
                x_center = (ma * mb * (lasty - nexty) + mb *
                            (lastx + x1) - ma * (x1 + nextx)) / (2 * (mb - ma))
                if abs(ma) > Zero:
                    y_center = -1 / ma * (x_center -
                                          (lastx + x1) / 2) + (lasty + y1) / 2
                elif abs(mb) > Zero:
                    y_center = -1 / mb * (x_center -
                                          (x1 + nextx) / 2) + (y1 + nexty) / 2

                R_arc = hypot(x1 - x_center, y1 - y_center)
                cord_a = hypot(dx_a, dy_a)
                cord_b = hypot(dx_b, dy_b)
                cord_limit = 2 * R_arc * sin(radians(seg_arc))

                try:
                    sagitta_a = R_arc - sqrt(R_arc**2 - cord_a**2)
                    sagitta_b = R_arc - sqrt(R_arc**2 - cord_b**2)
                    sagitta_min = min(sagitta_a, sagitta_b)
                except:
                    sagitta_min = 0.0

                SKIP = 0
                if FLAG_arc_last == 1:
                    if (abs(R_last - R_arc) > Zero
                            or abs(x_center_last - x_center) > Zero
                            or abs(y_center_last - y_center) > Zero):
                        SKIP = 1

                if (max(cord_a, cord_b) <= cord_limit and abs(ez) <= Zero
                        and L_a**2 + L_b**2 < L_c**2
                        and cord_a / cord_b >= 1.0 / 1.5
                        and cord_a / cord_b <= 1.5 and sagitta_min > Zero
                        and SKIP == 0):
                    seg_sin_test = (y1 - lasty) / cord_a
                    seg_cos_test = -(x1 - lastx) / cord_a
                    phi_test = get_angle(seg_sin_test, seg_cos_test)
                    X_test, Y_test = transform(x_center - lastx,
                                               y_center - lasty,
                                               radians(phi_test))
                    code = 'G2' if Y_test > 0.0 else 'G3'
                    x_center_last = x_center
                    y_center_last = y_center
                    R_last = R_arc
                    FLAG_arc = 1
    WRITE = 0

    if FLAG_line == 0 and FLAG_arc == 0:
        WRITE = 1

    return code, FLAG_arc, R_last, x_center_last, y_center_last, WRITE, FLAG_line
Exemplo n.º 13
0
def line_arc_fit(lastx, lasty, lastz, x1, y1, z1, nextx, nexty, nextz, FLAG_arc, code,
                 R_last, x_center_last, y_center_last, FLAG_line, accuracy, seg_arc):
    """
    Line fit and arc fit (curve fit)
    """

    # print lastx, lasty, lastz, x1, y1, z1, nextx, nexty, nextz
    # print FLAG_arc, code, R_last, x_center_last, y_center_last, FLAG_line, accuracy

    dx_a = x1 - lastx
    dy_a = y1 - lasty
    dz_a = z1 - lastz

    dx_c = nextx - lastx
    dy_c = nexty - lasty
    dz_c = nextz - lastz

    if abs(dx_a) > Zero:
        line_t = dx_c / dx_a
    elif abs(dy_a) > Zero:
        line_t = dy_c / dy_a
    elif abs(dz_a) > Zero:
        line_t = dz_c / dz_a
    else:
        line_t = 0

    ex = dx_c - dx_a * line_t
    ey = dy_c - dy_a * line_t
    ez = dz_c - dz_a * line_t
    et = sqrt(ex * ex + ey * ey + ez * ez)

    L_a = dx_a * dx_a + dy_a * dy_a + dz_a * dz_a
    L_c = dx_c * dx_c + dy_c * dy_c + dz_c * dz_c

    FLAG_arc_last = FLAG_arc
    FLAG_arc = 0

    FLAG_line_last = FLAG_line
    if et > accuracy or (L_a >= L_c) or FLAG_arc_last == 1:
        FLAG_line = 0
    else:
        FLAG_line = 1
        code = "G1"

    ###############
    # Arc Fitting #
    ###############

    arc_fit = 1

    if (FLAG_line != 1 and FLAG_line_last != 1 and line_t != 0 and arc_fit):
        dx_b = nextx - x1
        dy_b = nexty - y1
        dz_b = nextz - z1
        L_b = dx_b * dx_b + dy_b * dy_b + dz_b * dz_b

        if abs(dx_a) > Zero and abs(dx_b) > Zero:
            ma = dy_a / dx_a
            mb = dy_b / dx_b

            if abs(mb - ma) > Zero and (abs(ma) > Zero or abs(mb) > Zero):
                x_center = (ma * mb * (lasty - nexty) + mb * (lastx + x1) - ma * (x1 + nextx)) / (2 * (mb - ma))
                if abs(ma) > Zero:
                    y_center = -1 / ma * (x_center - (lastx + x1) / 2) + (lasty + y1) / 2
                elif abs(mb) > Zero:
                    y_center = -1 / mb * (x_center - (x1 + nextx) / 2) + (y1 + nexty) / 2

                R_arc = hypot(x1 - x_center, y1 - y_center)
                cord_a = hypot(dx_a, dy_a)
                cord_b = hypot(dx_b, dy_b)
                cord_limit = 2 * R_arc * sin(radians(seg_arc))

                try:
                    sagitta_a = R_arc - sqrt(R_arc ** 2 - cord_a ** 2)
                    sagitta_b = R_arc - sqrt(R_arc ** 2 - cord_b ** 2)
                    sagitta_min = min(sagitta_a, sagitta_b)
                except:
                    sagitta_min = 0.0

                SKIP = 0
                if FLAG_arc_last == 1:
                    if (
                            abs(R_last - R_arc) > Zero or
                            abs(x_center_last - x_center) > Zero or
                            abs(y_center_last - y_center) > Zero):
                        SKIP = 1

                if (max(cord_a, cord_b) <= cord_limit and
                        abs(ez) <= Zero and L_a ** 2 + L_b ** 2 < L_c ** 2 and
                        cord_a / cord_b >= 1.0 / 1.5 and cord_a / cord_b <= 1.5 and
                        sagitta_min > Zero and SKIP == 0):
                    seg_sin_test = (y1 - lasty) / cord_a
                    seg_cos_test = -(x1 - lastx) / cord_a
                    phi_test = get_angle(seg_sin_test, seg_cos_test)
                    X_test, Y_test = transform(x_center - lastx, y_center - lasty, radians(phi_test))
                    code = 'G2' if Y_test > 0.0 else 'G3'
                    x_center_last = x_center
                    y_center_last = y_center
                    R_last = R_arc
                    FLAG_arc = 1
    WRITE = 0

    if FLAG_line == 0 and FLAG_arc == 0:
        WRITE = 1

    return code, FLAG_arc, R_last, x_center_last, y_center_last, WRITE, FLAG_line