Получите случайные точки на краях квадрата в python - PullRequest
1 голос
/ 21 июня 2020

Вопрос

Учитывая окно построения, как можно генерировать случайные точки по периметру квадрата (периметру окна построения)?

Фон и попытка

Я нашел аналогичный вопрос относительно прямоугольника в javascript.

Мне удалось написать программу для генерации случайных точек в определенных пределах, но вопрос в том, как можно найти случайные точки при условии, что они находятся на краю графика (в данном случае либо x равно 5 или -5, либо y равно 5 или -5).

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

введите описание изображения здесь

Резюме

Итак, чтобы подвести итог, мой вопрос: как мне генерировать случайные координаты, учитывая, что они находятся на краю графика / холста. Мы будем благодарны за любой совет или помощь.

Ответы [ 6 ]

1 голос
/ 21 июня 2020

Можете ли вы попробовать это?

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

Вот пример вывода: введите описание изображения здесь

1 голос
/ 21 июня 2020

С геометрической точки зрения, пребывание на краю требует, чтобы точка удовлетворяла определенным условиям. Предполагая, что мы говорим о сетке, размеры которой определены x ~ [0, a] и y ~ [0, b]:

  • Координата y равна 0 или b, а координата x находится в пределах [0, a] или
  • Координата x равна 0 или a, при этом координата y находится в пределах [0, b]

Очевидно, существует более одного способа go об этом, но вот простой способ начать работу.

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()
1 голос
/ 21 июня 2020

Вот что вы можете сделать:

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

Вывод:

введите описание изображения здесь

1 голос
/ 21 июня 2020

Вот способ сделать это:

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

Результат:

введите описание изображения здесь

1 голос
/ 21 июня 2020

Вы можете использовать это, но это предполагает, что вы хотите их отбросить, когда обнаружите, что они не на грани.

for x in coordx:
    if x != a:
        coordx.pop(x)
    else:
        continue

А затем сделайте то же самое для y.

1 голос
/ 21 июня 2020

Один из возможных подходов (хотя и не очень элегантный): разделить горизонтальные и вертикальные точки. Предположим, вы хотите нарисовать точку вверху или внизу окна. Затем

  1. Выберите случайным образом координату y как b или - b
  2. Выберите случайным образом (равномерное распределение ) координата x

Аналогичный подход для правого и левого краев окна.

Надеюсь, что это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...