python - 从三角形中生成随机点
问题描述
我有以下代码在给定地图上生成随机点。我想避免在湖区(右上角)有点。我把湖分成了一个矩形和一个三角形。对于矩形,我可以弄清楚如何避免在那里有点。但是,对于三角形(用红线显示),我找不到解决方案。有什么建议吗?您可以在代码下方找到“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)
解决方案
您可以使用图像中的基础颜色来检查您的点是否合法。
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()
您可以看到问题是,在水面上有标签的地方,点会被绘制在标签上……但好处是,使用这种方法,您不必为新的地图部分进行自定义几何图形。
推荐阅读
- javascript - 如何将对象转换为数组?
- php - PHPExcel 日期格式
- javascript - 找不到打字稿模块(Vue)和意外的标记@Component
- r - 如何在字符串中查找模式并将其提取为数据框的新列
- debian - apt-get install 后未安装 Wireshark
- ionic-framework - 选择值相同时触发ionChange
- azure-devops - Azure CLI - 检查 Azure 前端端口是否已存在
- ios - 从 .xcodeproj 切换到 .xcworkspace 后无法实例化默认视图控制器
- python-3.x - 如何从python中的函数中一一返回值
- python - 如果不满足条件,如何让python函数重新开始?