É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()