如何以特定的行数和列数划分矩形?

Sel*_*man 7 python geometry

我正在尝试将具有特定坐标的矩形划分为 8 个较小的矩形(两列四行),这可能吗?

例如,输入将是:

rec = [(0, 0), (0, 330), (200, 330), (200, 0)]
Run Code Online (Sandbox Code Playgroud)

结果将是:

res = [[(0, 0), (0, 82), (100, 82), (100, 0)], [(0, 82), (0, 164), (100, 164), (100, 82)],.......]
Run Code Online (Sandbox Code Playgroud)

这是我迄今为止尝试过的:

h = 330
w = 200

offsets = [(0, 0), (400, 0), (0, 500), (400, 500)]

blisters = []

for offset in offsets:
    pol = [(offset), (offset[0], offset[1] + h), (offset[0] + w, offset[1] + h), (offset[0] + w, offset[1])]
    blisters.append(pol)

pits = []

for offset in offsets:
    pit = [(offset), (offset[0], int(offset[1] + a)), (int(offset[0] + b), int(offset[1] + a)), (int(offset[0] + b), offset[1]), ]
    pits.append(pit)
Run Code Online (Sandbox Code Playgroud)

这就是我需要的(有点:/):

starting point in upper left corner (eg.(0,0)) 
                         ___________
                         I    I    I
                         I    I    I
                         -----------
                         I    I    I
                         I    I    I
                         -----------
                         I    I    I
                         I    I    I
                         -----------
                         I    I    I
                         I    I    I
                         -----------
Run Code Online (Sandbox Code Playgroud)

Geo*_*rgy 6

如果您经常使用几何对象,您可能会考虑使用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)
Run Code Online (Sandbox Code Playgroud)

这是你的多边形:
在此输入图像描述

接下来,构建我们将用来分割该多边形的线列表:

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
Run Code Online (Sandbox Code Playgroud)

应用每条线来分割多边形:

result = polygon
for splitter in splitters:
    result = MultiPolygon(split(result, splitter))
Run Code Online (Sandbox Code Playgroud)

这就是生成的矩形集合的样子:
在此输入图像描述

如果您想要返回坐标列表,可以这样获取:

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)]]
Run Code Online (Sandbox Code Playgroud)