import sympy as sy
import numpy as np
import matplotlib.pyplot as plt

# Exercício 2: Bola de futebol com rotação (movimento a 3D)
#Determinar se é golo ou não, a bola ser chutada do canto
# com rotação. Implementar o movimento da bola usando o método de Euler com 3 dimensões.
#Considere as forças de gravidade, resistência do ar e a força de Magnus


# Constantes
m = 0.45  # kg
r = 0.11  # m
A = np.pi * r**2  # m²
rho_ar = 1.225  # kg/m³
g = 9.81  # m/s²
dt = 0.001  # s
vT = 100 / 3.6  # m/s, convertido de km/h
omega_y = 390  # rad/s

# Vetores iniciais
r_vec = np.array([0.0, 0.0, 23.8])
v_vec = np.array([25.0, 5.0, -50.0])
omega_vec = np.array([0.0, omega_y, 0.0])

# Armazenamento da trajetória
trajetoria = [r_vec.copy()]
tempo_total = 5  # segundos
n_passos = int(tempo_total / dt)

# Método de Euler
for _ in range(n_passos):
    # Força de arrasto (proporcional à velocidade)
    F_drag = -(m * g / vT**2) * np.linalg.norm(v_vec) * v_vec

    # Força de Magnus: 0.5 * A * rho * r * (omega × v)
    F_magnus = 0.5 * A * rho_ar * r * np.cross(omega_vec, v_vec)

    # Gravidade
    F_grav = np.array([0.0, -m * g, 0.0])

    # Soma das forças
    F_total = F_drag + F_magnus + F_grav
    a_vec = F_total / m

    # Atualização por Euler
    v_vec += a_vec * dt
    r_vec += v_vec * dt

    # Armazena a posição
    if r_vec[2] < -5:
        break
    trajetoria.append(r_vec.copy())

trajetoria = np.array(trajetoria)

# Gráfico da trajetória
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot(trajetoria[:, 0], trajetoria[:, 1], trajetoria[:, 2], label='Trajetória da bola')
ax.set_xlabel('X (m)')
ax.set_ylabel('Y (m)')
ax.set_zlabel('Z (m)')
ax.set_title('Movimento 3D da Bola com Efeito Magnus')
ax.legend()
plt.show()


# Verificar se a bola entrou na baliza nesta simulação

# Condições da baliza:
# x <= 0
# 0 < y < 2.4
# -3.66 < z < 3.66

# Procurar os pontos onde x está mais próximo de 0
x_coords = trajetoria[:, 0]
idx_closest_to_x0 = np.argmin(np.abs(x_coords))
ponto_mais_proximo_x0 = trajetoria[idx_closest_to_x0]
y_val, z_val = ponto_mais_proximo_x0[1], ponto_mais_proximo_x0[2]

# Verificação da condição de golo
entrou_na_baliza = (ponto_mais_proximo_x0[0] <= 0) and (0 < y_val < 2.4) and (-3.66 < z_val < 3.66)

print(ponto_mais_proximo_x0, entrou_na_baliza)