当初、ミンコフスキー和 or 差で実現できるかと思いましたが、 以下のようなスキャン(ブルートフォース?)を用いる方法にたどり着きました。
from shapely.geometry import box, Polygon import numpy as np import matplotlib.pyplot as plt # 多角形 a a = Polygon([(0, 0), (100, 0), (100, 50), (70, 80), (0, 80)]) # 四角形 b のサイズ bw, bh = 20, 20 # スキャン精度 step = 2 def main(): valid_positions = [] minx, miny, maxx, maxy = a.bounds for x in np.arange(minx, maxx - bw, step): for y in np.arange(miny, maxy - bh, step): b = box(x, y, x + bw, y + bh) if a.contains(b): valid_positions.append((x, y)) # 可視化 plt.figure() x, y = a.exterior.xy plt.plot(x, y, color='black', label='Polygon a') for px, py in valid_positions: r = box(px, py, px + bw, py + bh) rx, ry = r.exterior.xy plt.plot(rx, ry, color='blue', alpha=0.2) plt.gca().set_aspect('equal') plt.legend() plt.show() if __name__ == "__main__": main()
