如何确保另一个边界框中生成的随机边界框不重叠?

问题描述 投票:0回答:1

我有一个边界框

a = [233.9259,  16.3902, 356.8651, 426.9131]

import shapely.geometry
bbox = (233.9259,  16.3902, 356.8651, 426.9131)
polygon = shapely.geometry.box(*bbox, ccw=True)
polygon.bounds  # (233.9259, 16.3902, 356.8651, 426.913

我随机生成了 10 个大小为

8x8

的随机边界框
import random
from shapely.geometry import Polygon, Point

min_x, min_y, max_x, max_y = polygon.bounds
width = 8# to be defined
height = 8# to be defined
num_polygons = 10# to be defined
random_poly = []

while len(random_poly) < num_polygons:
  rand_x = random.uniform(min_x, max_x)
  rand_y = random.uniform(min_y, max_y)

  left = Point([rand_x, rand_y])
  bottom = Point([rand_x, rand_y - height])
  right = Point([rand_x + width, rand_y - height])
  top = Point([rand_x + width, rand_y])

  new_poly = Polygon([left, bottom, right, top])

  if polygon.contains(new_poly):
    random_poly.append(new_poly) 

如何确保这些生成的边界框不重叠?

python python-3.x opencv polygon shapely
1个回答
0
投票

使用一个附加条件扩展提供的代码即可解决问题。

这可能不是最高效的方法,但看到示例代码似乎并不是目标。

import random

from matplotlib import pyplot as plt
from shapely.geometry import Polygon, Point
import shapely

bbox = (233.9259, 16.3902, 356.8651, 426.9131)
bounding_box = shapely.geometry.box(*bbox)

min_x, min_y, max_x, max_y = bounding_box.bounds
width = 8  # to be defined
height = 8  # to be defined
num_polygons = 10  # to be defined
random_polygons = []

while len(random_polygons) < num_polygons:
    rand_x = random.uniform(min_x, max_x)
    rand_y = random.uniform(min_y, max_y)

    left = Point([rand_x, rand_y])
    bottom = Point([rand_x, rand_y - height])
    right = Point([rand_x + width, rand_y - height])
    top = Point([rand_x + width, rand_y])

    new_poly = Polygon([left, bottom, right, top])

    if bounding_box.contains(new_poly) and not shapely.MultiPolygon(random_polygons).touches(new_poly):
        random_polygons.append(new_poly)
© www.soinside.com 2019 - 2024. All rights reserved.