Vous êtes sur la page 1sur 4

import numpy as np

import matplotlib.pyplot as plt


from mpl_toolkits.mplot3d import Axes3D

# Dimensions d'un terrain de tennis standard (en mètres)


terrain_longueur = 23.77
terrain_largeur = 8.23
filet_hauteur = 0.5

# Création du terrain de tennis


def plot_terrain(ax):
# Dessiner le sol du terrain
ax.plot_surface(np.array([[0, terrain_longueur], [0, terrain_longueur]]) - terrain_longueur/2,
np.array([[0, 0], [terrain_largeur, terrain_largeur]]) - terrain_largeur/2,
np.array([[0, 0], [0, 0]]),
color='darkgreen', alpha=0.8)

# Dessiner le filet
ax.plot_surface(np.array([[0, terrain_longueur], [0, terrain_longueur]]) - terrain_longueur/2,
np.array([[4, 4], [4, 4]]) - terrain_largeur/2,
np.array([[0, 0], [filet_hauteur, filet_hauteur]]),
color='black', alpha=1)

# Fonction pour calculer la trajectoire de la balle avec rotation


def trajectoire_balle(vitesse_initiale, angle_lancer, hauteur_lancer, rotation_speed, gravite=9.81,
pas_temps=0.01):
# Initialisation des variables
vitesse_x = vitesse_initiale * np.cos(np.radians(angle_lancer))
vitesse_y = vitesse_initiale * np.sin(np.radians(angle_lancer))
vitesse_z = 0.0
temps = 0.0

# Listes pour stocker les coordonnées


positions_x = [0.0]
positions_y = [0.0]
positions_z = [hauteur_lancer]

# Boucle de calcul de la trajectoire


while True:
temps += pas_temps
vitesse_z -= gravite * pas_temps
nouvelle_position_x = positions_x[-1] + vitesse_x * pas_temps
nouvelle_position_y = positions_y[-1] + vitesse_y * pas_temps
nouvelle_position_z = max(0.0, positions_z[-1] + vitesse_z * pas_temps)

if nouvelle_position_z == 0.0 and nouvelle_position_y > 0.0:


# La balle a touché le sol du côté adverse
break

# Appliquer la rotation autour de l'axe z


rotation_matrix = np.array([[np.cos(rotation_speed*temps), -np.sin(rotation_speed*temps), 0],
[np.sin(rotation_speed*temps), np.cos(rotation_speed*temps), 0],
[0, 0, 1]])
nouvelle_position = np.dot(rotation_matrix, np.array([nouvelle_position_x, nouvelle_position_y,
nouvelle_position_z]))

positions_x.append(nouvelle_position[0])
positions_y.append(nouvelle_position[1])
positions_z.append(nouvelle_position[2])

return positions_x, positions_y, positions_z

# Paramètres de la balle et de la trajectoire


vitesse_initiale = 20.0 # en m/s
angle_lancer = 45.0 # en degrés
hauteur_lancer = 2.0 # hauteur initiale du lancer en mètres
rotation_speed = 0.05 # vitesse de rotation en rad/s

# Calcul de la trajectoire avec rotation


x, y, z = trajectoire_balle(vitesse_initiale, angle_lancer, hauteur_lancer, rotation_speed)

# Création du graphe 3D
fig = plt.figure(figsize=(12, 8))
ax = fig.add_subplot(111, projection='3d')

# Trajectoire décalée
ax.plot(x, y, z, color='blue', linewidth=2)

# Terrain de tennis décalé


plot_terrain(ax)

# Balle de tennis
ax.scatter(x[-1], y[-1], z[-1], color='red', marker='o', label='Position de la balle')

# Configuration des axes


ax.set_xlim([-terrain_longueur/2, terrain_longueur/2])
ax.set_ylim([-terrain_largeur/2, terrain_largeur/2])
ax.set_zlim([0, max(z) + 1]) # Ajout d'un mètre pour la marge

# Étiquettes des axes


ax.set_xlabel('X (m)')
ax.set_ylabel('Y (m)')
ax.set_zlabel('Z (m)')

# Titre du graphe
ax.set_title('Trajectoire de la balle de tennis avec rotation dans un terrain de tennis')

# Affichage du graphe
plt.show()

Vous aimerez peut-être aussi