1
votes

Obtenez des points aléatoires sur les bords d'un carré en python

Question

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

Arrière-plan et tentative

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

 entrez la description de l'image ici a>

Résumé

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é.


0 commentaires

6 Réponses :


1
votes

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,

  1. Sélectionnez au hasard la coordonnée y comme b ou - b
  2. Sélectionnez au hasard (distribution uniforme) la coordonnée x

Approche similaire pour les bords droit et gauche de la fenêtre.

J'espère que cela vous aidera.


0 commentaires

1
votes

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>


0 commentaires

1
votes

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:

 entrez la description de l'image ici

p>


0 commentaires

1
votes

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:

 entrez la description de l'image ici


4 commentaires

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.



1
votes

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] :

  • La coordonnée y est soit 0, soit b , avec la coordonnée x entre [0, a] ou
  • La coordonnée x est 0 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()


0 commentaires

1
votes

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

Voici un exemple de sortie: entrez la description de l'image ici


0 commentaires