# -*- coding: utf-8 -*- """ Created on Mon Oct 09 14:47:46 2017 Ce programme constitue une solution interactive de l'exercice 1-9. Il est équivalent à la version en Scilab qui figure sur ce site. Ce programme ne fonctionne pas sous Spyder parce que, sous cet environnement, Matplotlib monopolise la communication avec le programme utilisateur, rendant impossible le dialogue avec la console. Il fonctionne très bien dans l'environnement Thonny. Utilisation: lancer le programme puis: répéter 4 fois: cliquer dans la fenêtre graphique cliquer dans la console donner au clavier la valeur de la charge taper @author: hinsen inspiré par https://matplotlib.org/users/event_handling.html Merci à Konrad Hinsen """ from matplotlib import pyplot as plt import numpy as np class Charges: def __init__(self, ncharges): self.figure = plt.figure() self.charge_plot = self.figure.add_subplot(111) self.charge_plot.set_title('clic gauche dans la fenêtre pour placer une charge (%d en tout)' % ncharges) self.positive_dots, = self.charge_plot.plot([], [], 'ro') self.negative_dots, = self.charge_plot.plot([], [], 'bo') self.charge_plot.set_xlim(-5, 5) self.charge_plot.set_ylim(-5, 5) self.ncharges = ncharges self.xs = [] self.ys = [] self.cs = [] self.cid = self.figure.canvas.mpl_connect('button_press_event', self) def __call__(self, event): if event.inaxes != self.charge_plot: return self.figure.canvas.mpl_disconnect(self.cid) c = None while c is None: try: c = float(input("Valeur de la charge: ")) except ValueError: pass self.xs.append(event.xdata) self.ys.append(event.ydata) self.cs.append(c) positive = np.array(self.cs) >= 0. negative = np.logical_not(positive) self.positive_dots.set_data(np.repeat(self.xs, positive), np.repeat(self.ys, positive)) self.negative_dots.set_data(np.repeat(self.xs, negative), np.repeat(self.ys, negative)) self.figure.canvas.draw() if len(self.xs) == self.ncharges: self.plot_contour() self.figure.canvas.draw() else: self.cid = self.figure.canvas.mpl_connect('button_press_event', self) def plot_contour(self): X, Y = np.meshgrid(np.linspace(-5, 5, 100), np.linspace(-5, 5, 100)) Z = np.zeros(X.shape) for c, x, y in zip(self.cs, self.xs, self.ys): r2 = (x-X)**2 + (y-Y)**2 Z += c/np.sqrt(r2) self.charge_plot.contour(X, Y, Z, [-1,-0.5,-0.3,-0.1,0.1,0.3,0.5,1]) charge_plot = Charges(4) plt.show()