import numpy as np
import matplotlib.pyplot as plt

def dessiner_plan_complexe(ax, theta, titre):
    # 1. Dessiner le cercle unité (rayon = 1)
    cercle = plt.Circle((0, 0), 1, color='gray', fill=False, linestyle='--')
    ax.add_patch(cercle)
    
    # 2. Dessiner les axes (Réel et Imaginaire)
    ax.axhline(0, color='black', linewidth=1)
    ax.axvline(0, color='black', linewidth=1)
    ax.text(1.1, 0, 'Re', fontsize=12, va='center')
    ax.text(0, 1.1, 'Im', fontsize=12, ha='center')
    
    # 3. Placer les oscillateurs (points sur le cercle)
    x_oscillateurs = np.cos(theta)
    y_oscillateurs = np.sin(theta)
    ax.scatter(x_oscillateurs, y_oscillateurs, color='royalblue', s=80, 
               edgecolors='black', alpha=0.7, label=r'$e^{i\theta_j}$ (Oscillateurs)', zorder=3)
    
    # 4. Calculer et tracer le paramètre d'ordre (Le vecteur Z)
    Z = np.mean(np.exp(1j * theta))
    r = np.abs(Z)
    
    # Tracer la flèche rouge pour le centroïde
    ax.arrow(0, 0, Z.real, Z.imag, head_width=0.08, head_length=0.1, 
             fc='red', ec='red', linewidth=3, length_includes_head=True, zorder=4)
    
    # Ajouter le texte de r près de la flèche
    ax.text(Z.real/2 - 0.1, Z.imag/2 + 0.1, f'$r = {r:.2f}$', color='red', 
            fontsize=14, fontweight='bold', bbox=dict(facecolor='white', edgecolor='none', alpha=0.7))

    # 5. Mise en forme du graphique
    ax.set_xlim(-1.3, 1.3)
    ax.set_ylim(-1.3, 1.3)
    ax.set_aspect('equal') # Indispensable pour que le cercle soit rond !
    ax.axis('off')         # On cache le cadre par défaut
    ax.set_title(titre, fontsize=14, pad=10)

# --- GÉNÉRATION DES DONNÉES ---
N = 20 # Nombre d'oscillateurs
np.random.seed(15) # Pour avoir un beau rendu reproductible

# Cas 1 : Désordre (phases réparties uniformément)
theta_desordre = np.random.uniform(0, 2*np.pi, N)

# Cas 2 : Ordre (phases regroupées autour d'un angle, ex: pi/4)
theta_ordre = np.random.normal(loc=np.pi/4, scale=0.3, size=N)

# --- CRÉATION DE LA FIGURE ---
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(10, 5))

dessiner_plan_complexe(ax1, theta_desordre, "Désordre : Phases éparpillées")
dessiner_plan_complexe(ax2, theta_ordre, "Ordre : Phases groupées")

# Sauvegarde avec un fond transparent (très élégant pour Beamer !)
plt.tight_layout()
plt.savefig('parametre_ordre.png', dpi=300, transparent=True)
print("L'image 'parametre_ordre.png' a été créée !")

plt.show()
