Генерация полигонов, чтобы изображение было заполнено - PullRequest
0 голосов
/ 22 октября 2019

Я хотел бы сгенерировать n полигонов, скажем, 50, чтобы они заполняли все данное изображение, скажем, 300x300 пикселей.

Я также хотел бы, чтобы каждый из полигонов был двухмерным треугольником, т.е. случайный процесс выбора не должен выбирать 3 точки на одной и той же линии по оси у или х.

Вот мое решение до сих пор

import PIL.ImageDraw as ImageDraw
import PIL.Image as Image
import random
import numpy as np

dimensions = (300, 300)
img = Image.new('RGB', dimensions)

polygons = [[tuple(np.random.randint(low=0, high=dimensions[1] + 1, size=2)) for _ in range(3)] for _ in range(50)]

drw = ImageDraw.Draw(img, 'RGBA')
for i in range(50):
    random_numbers = np.random.randint(low=0, high=256, size=(50, 3))
    generated_colours = [tuple(colour + [128]) for colour in random_numbers.tolist()]
    drw.polygon(polygons[i], generated_colours[i])
del drw

img.show()

Это создает 50 полупрозрачных полигонов, но они не заполняютформа и это позволяет создать многоугольник, который по сути является линией.

Как я могу добиться того, что я хочу?

РЕДАКТИРОВАТЬ: Кроме того, я хотел генерировать многоугольники более эффективным способом,но по какой-то причине.

polygons = np.random.randint(low=0, high=dimensions[1], size=(50, 3, 2))

не работает.

EDIT2: Я думаю, что я решил проблему создания линий, однако я думаю, что, возможно, эффективность может быть улучшена

polygons = []
for i in range(50):
    coordinates = [[-1, -1], [-1, -1], [-1, -1]]
    for j in range(3):
        new_coordinates = tuple(np.random.randint(low=0, high=300 + 1, size=2))
        while new_coordinates[0] in [coordinates[0][0], coordinates[1][0], coordinates[2][0]] or new_coordinates[1] in [coordinates[0][1], coordinates[1][1], coordinates[2][1]]:
            new_coordinates = tuple(np.random.randint(low=0, high=300 + 1, size=2))
        coordinates[j] = new_coordinates
    polygons.append(coordinates)
...