import numpy as np
import matplotlib.pyplot as plt

# Définition de la distribution de charge :
charges = [-1, 0.5 , 0.5] # valeurs des charges en unité arbitraire
positions = [[-1, 0], [1, 1.5], [1, -1.5]] # positions des charges (toutes les longueurs sont dans une unité arbitraire)
N = len(charges)

# Paramètres du tracé :
Delta_l = 0.01 # longueur d'un pas
d = 0.2 # distance à la charge ponctuelle au début du tracé
dmin = d - Delta_l # distance minimale pour le critère d'arrêt du tracé
nldc = 6 # nombre de lignes de champ initiées autour de chaque charge
nmax = 400 # nombre de maximum d'étapes dans le tracé d'une ligne de champ

# Remarque : pour simplifier, car cela n'a aucune incidence sur le tracé des lignes de champ, on travaille dans un système d'unités tel que 1/(4*pi*epsilon_0) = 1

def champ(M) : # calcule le champ électrique
# À compléter
    return Ex, Ey

def distmin(M) : # renvoie la plus petite des distances entre M et les points où sont placées les charges
# À compléter
    return

def traceLdc(M, sens) : # trace une ligne de champ en partant du point M, dans le sens du champ (sens = 1) ou dans le sens inverse (sens = -1).
# Fabriquer les listes X et Y des coordonnées des points formant la ligne de champ
# Ne pas oublier la condition d'arrêt

# Et on finit par le tracé de la ligne de champ
    plt.plot(X, Y)

# Boucle utilisant les fonctions précédentes pour tracer des lignes de champs réparties régulièrement autour des différentes charges de la distribution
for i in range(N) :
    xi, yi = positions[i]
    sens = np.sign(charges[i]) # le sens de tracé est le signe de la charge voisine du point de départ
    for il in range(nldc) :
        x = xi + d*np.cos(2 * np.pi * il / nldc)
        y = yi + d*np.sin(2 * np.pi * il / nldc)
        traceLdc([x, y], sens)

plt.axis('equal') # pour avoir des axes orthonormés
plt.show()
