Генерация случайных точек из треугольника - PullRequest
0 голосов
/ 15 февраля 2020

У меня есть следующий код для генерации случайных точек на данной карте. Я хочу, чтобы не было точек в районе озера (в верхнем правом углу). Я как бы разделил озеро на прямоугольник и треугольник. Для прямоугольника я мог бы выяснить, как избежать наличия точек там. Но для треугольника (показанного красной линией) я не смог найти решение. Любое предложение? Вы можете найти «Map.png» под кодом.

enter image description here

import numpy as np
import matplotlib.pyplot as plt

def point_generator(number):
    xlist,ylist = [], []
    for i in range(number):
        x = np.random.uniform(BBox[0],BBox[1])
        y = np.random.uniform(BBox[2],BBox[3])
        while x>-87.8 and y>42.25:
            x = np.random.uniform(BBox[0],BBox[1])
            y = np.random.uniform(BBox[2],BBox[3])
        xlist.append(x); ylist.append(y)
    return(xlist,ylist)

BBox = ((-89.541239, -87.541239,      
         40.773460, 42.498943))
im = plt.imread('Map.png')

fig, ax = plt.subplots(figsize = (15,15))
ax.set_xlim(BBox[0],BBox[1])
ax.set_ylim(BBox[2],BBox[3])

plt.plot([-87.8,-87.8],[42.25,42.498943],'-k')
plt.plot([-87.8,-87.541239],[42.25,42.25],'-k')
plt.plot([-87.8,-87.541239],[42.25,41.75],'-r')

xs,ys = point_generator(1500)
plt.plot(xs,ys, '.b')
ax.imshow(im, zorder=0, extent = BBox, aspect= 'equal',alpha=0.5)

here

Ответы [ 3 ]

1 голос
/ 15 февраля 2020

Вы можете использовать нижележащий цвет с изображения, чтобы проверить, равны ли ваши очки git.

import numpy as np
import matplotlib.pyplot as plt
from PIL import Image

def bBoxPointToColor(px,w,h,BBox,point):
    row = int(((BBox[3]-point[1])/(BBox[3]-BBox[2]))*h)
    col = int(((point[0]-BBox[0])/(BBox[1]-BBox[0]))*w)
    return sum(abs(k[0]-k[1]) for k in zip(px[col,row],(159, 214, 255))) < 10

def point_generator(number,BBox):
    img = Image.open('Chicago.jpg')
    px = img.load()
    xlist,ylist = [], []
    for i in range(number):
        x = np.random.uniform(BBox[0],BBox[1])
        y = np.random.uniform(BBox[2],BBox[3])
        while bBoxPointToColor(px,img.width,img.height,BBox,[x,y]):
            x = np.random.uniform(BBox[0],BBox[1])
            y = np.random.uniform(BBox[2],BBox[3])
        xlist.append(x); ylist.append(y)
    return(xlist,ylist)

BBox = ((-89.541239, -87.541239,      
         40.773460, 42.498943))

im = plt.imread('Chicago.jpg')


fig, ax = plt.subplots(figsize = (15,15))
ax.set_xlim(BBox[0],BBox[1])
ax.set_ylim(BBox[2],BBox[3])


xs,ys = point_generator(1500,BBox)
plt.plot(xs,ys, '.b')
ax.imshow(im, zorder=0, extent = BBox, aspect= 'equal',alpha=0.5)
plt.show()

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

enter image description here

0 голосов
/ 15 февраля 2020

Я действительно не знаю pandas, но, возможно, вы могли бы получить координаты (x1, y1) начальной точки, для которой вы хотите удалить точки, а затем координаты конечной точки, которую вы хотите (x2, y2), а затем создайте прямоугольник с прямоугольником, который вы создали, например (x1, y1)-(x2, y2) - это одна сторона, умноженная на (x2, y2)-(x2, y1) - это другая сторона, с которой вы умножаетесь, чтобы получить прямоугольник. Половина этого, и вы получили береговую линию, показанную на вашем изображении. Гипотенуза - это фактическая береговая линия

  • Прямоугольник: ((x2, y1) - (x1, y1)) * ((x2, y1) - (x2, y2)) = E(rect)

  • Треугольник: E(rect) / 2 = E(triangle)

  • Береговая линия: ((x2, y1) - (x1, y1)) ** 2 + ((x2, y1) - (x2, y2)) ** 2 = Hypotenuse (Coastline)

  • Графическое представление:

Итак, теперь у вас есть поверхность, которая Вы не хотите, чтобы внутри появлялись точки и координаты, составляющие эту поверхность.

0 голосов
/ 15 февраля 2020

Простой, но правильный способ добиться этого - генерировать случайные точки по всей поверхности, а затем удалять случайные точки, попавшие в нежелательные области. Таким образом, учитывая, что распределение является равномерным во всех областях, оставшееся распределение все еще остается равномерным.

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