Я хотел бы сгенерировать 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)