← Retour aux projets en programmation

Simulation de Trajectoires d'Avions avec Détection de Collision

Trois avions sont simulés dans un espace bidimensionnel avec des vitesses et directions aléatoires. Le système détecte et affiche les collisions en fonction d'un seuil défini.

1. Classe Avion

class Avion:
    def __init__(self, position, vitesse, direction):
        self.position = np.array(position, dtype=float)
        self.vitesse = vitesse
        self.direction = np.array(direction, dtype=float)
        self.trajectoire = [self.position.copy()]
        self.actif = True

    def deplacement(self):
        if self.actif:
            self.position = self.position + self.direction * self.vitesse
            self.trajectoire.append(self.position.copy())
  

2. Simulation

NB_ITER = 100
TAILLE = 50
SEUIL_COLLISION = 5

avions = [Avion(
    position=[random.uniform(10, TAILLE-10), random.uniform(10, TAILLE-10)],
    vitesse=random.uniform(1, 3),
    direction=[random.uniform(-1, 1), random.uniform(-1, 1)]
) for _ in range(3)]

for i in range(NB_ITER):
    for avion in avions:
        avion.deplacement()

    d12 = np.linalg.norm(avions[0].position - avions[1].position)
    d23 = np.linalg.norm(avions[1].position - avions[2].position)
    d13 = np.linalg.norm(avions[0].position - avions[2].position)

    if avions[0].actif and avions[1].actif and d12 < SEUIL_COLLISION:
        print(f"Collision entre avion 1 et 2 à l'étape {i}")
        avions[0].actif = avions[1].actif = False
    if avions[1].actif and avions[2].actif and d23 < SEUIL_COLLISION:
        print(f"Collision entre avion 2 et 3 à l'étape {i}")
        avions[1].actif = avions[2].actif = False
    if avions[0].actif and avions[2].actif and d13 < SEUIL_COLLISION:
        print(f"Collision entre avion 1 et 3 à l'étape {i}")
        avions[0].actif = avions[2].actif = False

3. Affichage des Trajectoires

plt.figure(figsize=(12, 12))
couleurs = ['b', 'g', 'orange']

for i, avion in enumerate(avions):
    trajectoire = np.array(avion.trajectoire)
    plt.plot(trajectoire[:, 0], trajectoire[:, 1], color=couleurs[i], label=f"Avion {i+1}")
    plt.scatter(trajectoire[0, 0], trajectoire[0, 1], color=couleurs[i], marker='o', label=f"Départ {i+1}")
    plt.scatter(trajectoire[-1, 0], trajectoire[-1, 1], color=couleurs[i], marker='x', label=f"Arrivée {i+1}")

plt.title("Trajectoires des avions")
plt.xlabel("X")
plt.ylabel("Y")
plt.xlim(0, TAILLE)
plt.ylim(0, TAILLE)
plt.legend()
plt.grid(True)
plt.show()

Trajectoire des avions avec collision (arrêt de l'avion 1 et 2) :

Trajectoire avec collision

Trajectoire des avions sans collision :

Trajectoire sans collision
Afin de passer d’un modèle 2D à un modèle 3D, il faut transformer les matrices de positions et de directions 2D en matrices 3D.

Passage du 2D en 3D

avion1 = Avion(
    position=[random.uniform(10, TAILLE-10), random.uniform(10, TAILLE-10), random.uniform(10, TAILLE-10)],
    vitesse=random.uniform(1, 3),
    direction=[random.uniform(-1, 1), random.uniform(-1, 1), random.uniform(-1, 1)]
)

Trajectoire des avions dans un espace 3D :

Trajectoire avec collision