Étant donné une fenêtre de traçage, comment générer des points aléatoires au périmètre d'un carré (périmètre de la fenêtre de traçage)?
I a trouvé une question similaire concernant a rectangle en javascript .
J'ai réussi à écrire un programme pour générer des points aléatoires dans des limites mais la question est de savoir comment on pourrait trouver des points aléatoires à la condition qu'ils soient au bord de l'intrigue (soit x est égal à 5 ou -5, soit y est égal à 5 ou -5 dans ce cas).
import numpy as np import matplotlib.pyplot as plt # Parameters n = 6 # number of points a = 5 # upper bound b = -5 # lower bound # Random coordinates [b,a) uniform distributed coordy = (b - a) * np.random.random_sample((n,)) + a # generate random y coordx = (b - a) * np.random.random_sample((n,)) + a # generate random x # Create limits (x,y)=((-5,5),(-5,5)) plt.xlim((b,a)) plt.ylim((b,a)) # Plot points for i in range(n): plt.plot(coordx[i],coordy[i],'ro') plt.show()
Donc, pour résumer, ma question est de savoir comment générer des coordonnées aléatoires étant donné qu'elles sont au bord du tracé / du canevas. Tout conseil ou aide sera apprécié.
6 Réponses :
Une approche possible (même si elle n'est pas très élégante) est la suivante: diviser les points horizontaux et verticaux Supposons que vous vouliez dessiner un point en haut ou en bas de la fenêtre. Ensuite,
Approche similaire pour les bords droit et gauche de la fenêtre.
J'espère que cela vous aidera.
Vous pouvez utiliser ceci, mais cela suppose que vous vouliez les supprimer quand il est trouvé qu'ils ne sont pas sur le bord.
for x in coordx: if x != a: coordx.pop(x) else: continue
Et puis faites de même pour y. p>
Voici un moyen de le faire:
import numpy as np import matplotlib.pyplot as plt # Parameters n = 6 # number of points a = 5 # upper bound b = -5 # lower bound # Random coordinates [b,a) uniform distributed coordy = (b - a) * np.random.random_sample((n,)) + a # generate random y coordx = (b - a) * np.random.random_sample((n,)) + a # generate random x # This is the new code reset_axis = np.random.choice([True, False], n) # select which axis to reset reset_direction = np.random.choice([a,b], n) # select to go up / right or down / left coordx[reset_axis] = reset_direction[reset_axis] coordy[~reset_axis] = reset_direction[~reset_axis] # end of new code. # Create limits (x,y)=((-5,5),(-5,5)) plt.xlim((b,a)) plt.ylim((b,a)) # Plot points for i in range(n): plt.plot(coordx[i],coordy[i],'ro') plt.show()
Le résultat est:
p>
Voici ce que vous pouvez faire:
from random import choice import matplotlib.pyplot as plt from numpy.random import random_sample n = 6 a = 5 b = -5 plt.xlim((b,a)) plt.ylim((b,a)) for i in range(n): r = (b - a) * random_sample() + a random_point = choice([(choice([a,b]), r),(r, choice([a,b]))]) plt.scatter(random_point[0],random_point[1]) plt.show()
Sortie:
Salut @Ann Zen, cette solution donne une erreur, "TypeError: choice () prend 2 arguments positionnels mais 3 ont été donnés"
Désolé, il fallait des crochets :)
choice ((choice ([a, b]), r), (1,2)) Je pense que c'est ici que c'est arrivé
Oh oui, désolé Cela signifie que vous êtes "génial" dans / chez Python.
D'un point de vue géométrique, être sur le bord nécessite qu'un point remplisse certaines conditions. En supposant que l'on parle d'une grille dont les dimensions sont définies par x ~ [0, a]
et y ~ [0, b]
:
b
, avec la coordonnée x entre [0, a]
ou a
, avec la coordonnée y entre [0, b]
Il y a évidemment plus d'une façon de procéder, mais voici une méthode simple pour vous aider à démarrer.
def plot_edges(n_points, x_max, y_max, x_min=0, y_min=0): # if x_max - x_min = y_max - y_min, plot a square # otherwise, plot a rectangle vertical_edge_x = np.random.uniform(x_min, x_max, n_points) vertical_edige_y = np.asarray([y_min, y_max])[ np.random.randint(2, size=n_points) ] horizontal_edge_x = np.asarray([x_min, x_max])[ np.random.randint(2, size=n_points) ] horizontal_edge_y = np.random.uniform(x_min, x_max, n_points) # plot generated points plt.scatter(vertical_edge_x, vertical_edige_y) plt.scatter(horizontal_edge_x, horizontal_edge_y) plt.show()
Pouvez-vous essayer ceci?
import numpy as np import matplotlib.pyplot as plt # Parameters n = 6 # number of points a = 5 # upper bound b = -5 # lower bound import random coordx,coordy=[],[] for i in range(n): xy = random.choice(['x','y']) if xy=='x': coordx.append(random.choice([b,a])) # generate random x coordy.append(random.random()) # generate random y if xy=='y': coordx.append(random.random()) # generate random x coordy.append(random.choice([b,a])) # generate random y # Create limits (x,y)=((-5,5),(-5,5)) plt.xlim((b,a)) plt.ylim((b,a)) # Plot points for i in range(n): plt.plot(coordx[i],coordy[i],'ro') plt.show()