import numpy as np import matplotlib.pyplot as plt ## Première version entre deux points def distance_periodique(L, point1, point2): # distance horizontales et verticales dans la boite delta_x = point1[0] - point2[0] delta_y = point1[1] - point2[1] # distance les plus courtes en tenant compte des bords périodiques delta_x_p = delta_x - L * np.round(delta_x / L) delta_y_p = delta_y - L * np.round(delta_y / L) return np.sqrt(delta_x_p**2 + delta_y_p**2) # Exemple d'utilisation L = 10 point1 = np.array([4, 1]) point2 = np.array([5, 9]) distance = distance_periodique(L, point1, point2) # {.2f} indique que l'on veut afficher le nombre contenu dans .format(distance) avec # 2 chiffres après la virgule à l'endroit des accolades print("Distance périodique: {:.2f}".format(distance)) # les points en précisant leur coordonnées suivant x puis y # c = '' spécifie la couleur de chaque point # label donne un nom à chaque plot qui sera affiché lorsqu'on appelle plt.legend() plt.scatter(point1[0], point1[1], c='red', label='Point 1') plt.scatter(point2[0], point2[1], c='blue', label='Point 2') # Affichage de la boîte périodique en reliant consécutivement les # 4 sommets de la boîte (0, 0), (L,0), (L,L), (0,L), (0,0) plt.plot([0, L, L, 0, 0], [0, 0, L, L, 0], c="black") plt.legend() plt.show() # on voit que la distance calculé est bien plus courte que celle qui sépare # les deux points sur le graphe car les bords périodiques font qu'en réalite # ces points sont proches ## Version entre un point et un tableaux de points def distance_periodique(L, point1, points2): # On remplace points2[0] par points[2:,0] pour effectuer d'un coup # les calculs de distance horizontales entre x1 et tout les x # des points contenus dans points2 (de même pour y) delta_x = point1[0] - points2[:,0] delta_y = point1[1] - points2[:,1] # On obtient delta_x et delta_y deux tableaux contenant les # distance horizontales/verticales entre point1 et tout les points de points2 # np.round, /L et np.sqrt effectuent directement les opérations mathématiques sur # chacun des éléments des tableaux delta_x_p = delta_x - L * np.round(delta_x / L) delta_y_p = delta_y - L * np.round(delta_y / L) return np.sqrt(delta_x_p**2 + delta_y_p**2) # Exemple d'utilisation L = 10 # np.random.uniform permet de générer directement un tableaux de taille spécifiée par le # troisième argument et dont les valeurs sont tirées aléatoirement entre 0 et L ici point1 = np.random.uniform(0,L,2) points2 = np.random.uniform(0,L,(5,2)) distances = distance_periodique(L, point1, points2) np.set_printoptions(precision=2) # 2 chiffres après la virgule lorsqu'on affiche des tableaux print("Distances périodiques:" + str(distances)) plt.scatter(point1[0], point1[1], c='black', label='Point1') # Affichage et numération de chaque point contenu dans points2 for i in range(5): plt.scatter(points2[i,0], points2[i,1],label='Points2 : ' + str(i)) # Affichage de la boîte périodique en reliant consécutivement les # 4 sommets de la boîte (0, 0), (L,0), (L,L), (0,L), (0,0) plt.plot([0, L, L, 0, 0], [0, 0, L, L, 0], c="black") plt.legend() plt.show()