... | ... | @@ -79,10 +79,8 @@ Cette fois, on va calculer la distance du point à chacun des points de la courb |
|
|
def onclick_proche(event):
|
|
|
x_souris, y_souris = event.xdata, event.ydata
|
|
|
# deux syntaxes équivalentes, une avec get_data() l'autre avec get_xdata() et get_ydata()
|
|
|
# solution 1 : on boucle sur deux listes en même temps avec zip pour former un tuple (x,y)
|
|
|
# zip permet de boucler sur deux listes en même temps pour former un tuple (x,y)
|
|
|
distances = [((x-x_souris)**2 + (y-y_souris)**2)**(1/2) for (x,y) in zip(donnees.get_xdata(), donnees.get_ydata())]
|
|
|
# équivalent plus simple, où on boucle sur une liste de **tuples**
|
|
|
# distances = [((x-x_souris)**2 + (y-y_souris)**2)**(1/2) for (x,y) in donnees.get_data()]
|
|
|
|
|
|
distance_min = min(distances)
|
|
|
idx_min = np.argmin(distances)
|
... | ... | @@ -98,15 +96,15 @@ fig.canvas.mpl_connect('button_press_event', onclick_proche) |
|
|
plt.show()
|
|
|
```
|
|
|
|
|
|
Le code "fait le travail", vous pouvez tester et essayer avec d'autres jeux de données. Vous pourrez trouvez des données pour lesquels le calcul des distances proposé ici n'est pas satisfaisant car il n'identifie pas le point le plus proche "visuellement".
|
|
|
Le code "fait le travail", vous pouvez tester et essayer avec d'autres jeux de données.
|
|
|
Vous pourrez trouver des données pour lesquelles le calcul des distances proposé ici n'est pas satisfaisant car il n'identifie pas le point le plus proche "visuellement" : il est donc préférable de raisonner en unités "écran", ce qu'on fera dans la suite.
|
|
|
|
|
|
### Le tableau ci-dessous montre le résultat de l'identification du point le plus proche à partir des coordonnées de la souris ou de Picker, pour ce deuxième cas en montrant la différence de calculs distance "unités courbes" et distances "écran"
|
|
|
|
|
|
```plaintext
|
|
|
| code ci-dessus, basé sur MouseEvent | code basé sur Picker (voir ci-dessous)|
|
|
|
| code ci-dessus | code ci-dessous, avec plusieurs courbes|
|
|
|
|-----------------|------------------------------|
|
|
|
| ![Figure initiale, 10points alignés](uploads/467300d845b9a2e75b1b8ecca19328d8/selection_point_mouseclick.png) | ![selection_picker2](uploads/36f24ebb707baac8a9af0c29c562d76c/selection_picker2.png) |
|
|
|
|<i> une étoile rouge matérialise le point identifié comme le plus proche du clic de souris </i>|<i>résultats en distance "unités courbes" et distances "écran", avec affichage dans des annotations</i>|
|
|
|
| ![Figure initiale, 10points alignés](uploads/467300d845b9a2e75b1b8ecca19328d8/selection_point_mouseclick.png) | ![selection_point_mouseclick_2courbes](uploads/5e59b3773c9d83f464047deb72e4d5ff/selection_point_mouseclick_2courbes.png) |
|
|
|
|<i> une étoile rouge matérialise le point identifié comme le plus proche du clic de souris </i>|<i>résultats en distance "unités écran", pour 2 courbes</i>|
|
|
|
|
|
|
|
|
|
### Avec une figure comportant 2 courbes ou plus.
|
|
|
|
... | ... | @@ -135,8 +133,7 @@ def onclick_proche_2courbes(event): |
|
|
def operations_sur_une_courbe(courbe, annotation, carre, ratio_w_sur_h = None):
|
|
|
"""
|
|
|
# si on ne passe pas comme argument ratio_w_sur_h, sa valeur par défaut sera None : on raisonne en "distance données"
|
|
|
# pour ça il faut aussi REASSIGNER LOCALEMENT DANS CETTE SOUS-FONCTION 1 à ratio_w_sur_h, delta_x et delta_y
|
|
|
# sinon, on passe le ratio largeur/hauteur de la vignette et on raisonne bien en "distance écran"
|
|
|
# sinon, on passe le ratio largeur/hauteur de la vignette et on raisonne en "distance écran"
|
|
|
"""
|
|
|
|
|
|
if ratio_w_sur_h is None:
|
... | ... | @@ -230,7 +227,8 @@ plt.show() |
|
|
|
|
|
## Avec un "PickEvent" :
|
|
|
|
|
|
La méthode précédente fonctionne, mais elle a l'inconvénient de faire des calculs sur l'ensemble des points de la courbe. On va utiliser la notion de _picker_, toujours sur une figure ne comportant qu'une seule courbe, afin de réaliser une **présélection**. Si on a plusieurs courbes, on peut ne lier le picker qu'à certaines d'entre elles. Si plusieurs sont réceptives au picker, la fonction liée sera déclenchée une fois pour chacune.
|
|
|
La méthode précédente fonctionne, mais elle a l'inconvénient de faire des calculs sur l'ensemble des points de la courbe. On va utiliser la notion de _picker_, toujours sur une figure ne comportant qu'une seule courbe, afin de réaliser une **présélection**.
|
|
|
Si on a plusieurs courbes, on peut ne lier le picker qu'à certaines d'entre elles. Si plusieurs sont réceptives au picker, la fonction liée sera déclenchée une fois pour chacune.
|
|
|
|
|
|
![sélection picker](uploads/510c61180d0c1d51a059871fed23ab1c/selection_picker.png)
|
|
|
|
... | ... | @@ -343,4 +341,3 @@ nuage, = ax.plot(x, y, '*', c='blue', label="nuage", picker=init_radius, ls='Non |
|
|
textbox_radius.on_submit(submit_radius)
|
|
|
```
|
|
|
|
|
|
![selection_point_mouseclick_2courbes](uploads/5e59b3773c9d83f464047deb72e4d5ff/selection_point_mouseclick_2courbes.png) |
|
|
\ No newline at end of file |