Как разделить прямоугольник на определенное количество строк и столбцов? - PullRequest
4 голосов
/ 08 октября 2019

Я пытаюсь разделить прямоугольник с определенными координатами на 8 меньших прямоугольников (два столбца и четыре строки), возможно ли это?

Например, введите:

rec = [(0, 0), (0, 330), (200, 330), (200, 0)]

ирезультат будет:

res = [[(0, 0), (0, 82), (100, 82), (100, 0)], [(0, 82), (0, 164), (100, 164), (100, 82)],.......]

Это то, что я пробовал до сих пор:

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)

Это то, что мне нужно (вроде: /):

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
                         -----------

Ответы [ 3 ]

2 голосов
/ 08 октября 2019

Если вы используете библиотеку numpy, проблема значительно упрощается при использовании функции linspace, которая генерирует точки с равным интервалом.

import numpy as np

h = 330
n_rows = 4

w = 200
n_cols = 2

offset_x = w / n_cols
offset_y = h / n_rows

rectangles = []
for x in np.linspace(0, w, n_cols+1).tolist()[:-1]:
    for y in np.linspace(0, h, n_rows+1).tolist()[:-1]:
        x1 = int(round(x))
        x2 = int(round(x + offset_x))
        y1 = int(round(y))
        y2 = int(round(y + offset_y))
        rectangles.append([(x1, y1), (x1, y2), (x2, y2), (x2, y1)])

print(rectangles)
2 голосов
/ 08 октября 2019

Если вы много работаете с геометрическими объектами, вы можете рассмотреть возможность использования библиотеки 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)

Это ваш многоугольник:
enter image description here

Далее строится список строк, которые мы будем использовать для 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))

Вот так будет выглядеть полученная коллекция прямоугольников:
enter image description here

Если вы хотите вернуть список координат, вы можете получить их так:

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)]]
0 голосов
/ 08 октября 2019

Добро пожаловать в StackOverflow!

Это довольно просто. Просто разделите границы на столбцы и строки, а затем выполните итерации по ним:

cols, rows = 2, 4
width, height = 200.0, 330.0

w = width / cols
h = height / rows

result = []
for c in range(cols + 1):
    for r in range(rows + 1):
        result.append((c * w, r * h))

print result

# [(0.0, 0.0), (0.0, 82.5), (0.0, 165.0), (0.0, 247.5), (0.0, 330.0), 
# (100.0, 0.0), (100.0, 82.5), (100.0, 165.0), (100.0, 247.5), 
# (100.0, 330.0), (200.0, 0.0), (200.0, 82.5), (200.0, 165.0), 
# (200.0, 247.5), (200.0, 330.0)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...