Если вы много работаете с геометрическими объектами, вы можете рассмотреть возможность использования библиотеки Shapely . Он имеет некоторые полезные функции, которые мы могли бы использовать для построения сетки меньших прямоугольников из данного прямоугольника.
Сначала создадим Polygon
из вашего списка кортежей:
from shapely.geometry import LineString, MultiPolygon, Polygon
from shapely.ops import split
rec = [(0, 0), (0, 330), (200, 330), (200, 0)]
nx, ny = 2, 4 # number of columns and rows
polygon = Polygon(rec)
Это ваш многоугольник:
Далее строится список строк, которые мы будем использовать для split , которыеpolygon:
minx, miny, maxx, maxy = polygon.bounds
dx = (maxx - minx) / nx # width of a small part
dy = (maxy - miny) / ny # height of a small part
horizontal_splitters = [LineString([(minx, miny + i*dy), (maxx, miny + i*dy)]) for i in range(ny)]
vertical_splitters = [LineString([(minx + i*dx, miny), (minx + i*dx, maxy)]) for i in range(nx)]
splitters = horizontal_splitters + vertical_splitters
Применение каждой строки для разбиения многоугольника:
result = polygon
for splitter in splitters:
result = MultiPolygon(split(result, splitter))
Вот так будет выглядеть полученная коллекция прямоугольников:
Если вы хотите вернуть список координат, вы можете получить их так:
parts = [list(part.exterior.coords) for part in result.geoms]
print(parts)
# [[(0.0, 0.0), (0.0, 82.5), (100.0, 82.5), (100.0, 0.0), (0.0, 0.0)],
# [(100.0, 82.5), (200.0, 82.5), (200.0, 0.0), (100.0, 0.0), (100.0, 82.5)],
# [(0.0, 82.5), (0.0, 165.0), (100.0, 165.0), (100.0, 82.5), (0.0, 82.5)],
# [(100.0, 165.0), (200.0, 165.0), (200.0, 82.5), (100.0, 82.5), (100.0, 165.0)],
# [(0.0, 165.0), (0.0, 247.5), (100.0, 247.5), (100.0, 165.0), (0.0, 165.0)],
# [(100.0, 247.5), (200.0, 247.5), (200.0, 165.0), (100.0, 165.0), (100.0, 247.5)],
# [(0.0, 247.5), (0.0, 330.0), (100.0, 330.0), (100.0, 247.5), (0.0, 247.5)],
# [(100.0, 330.0), (200.0, 330.0), (200.0, 247.5), (100.0, 247.5), (100.0, 330.0)]]