首页 > 解决方案 > 从三角形中生成随机点

问题描述

我有以下代码在给定地图上生成随机点。我想避免在湖区(右上角)有点。我把湖分成了一个矩形和一个三角形。对于矩形,我可以弄清楚如何避免在那里有点。但是,对于三角形(用红线显示),我找不到解决方案。有什么建议吗?您可以在代码下方找到“Map.png”。

在此处输入图像描述

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)

这里

标签: pythonmatplotlib

解决方案


您可以使用图像中的基础颜色来检查您的点是否合法。

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

您可以看到问题是,在水面上有标签的地方,点会被绘制在标签上……但好处是,使用这种方法,您不必为新的地图部分进行自定义几何图形。

在此处输入图像描述


推荐阅读