From ff7455495d19d8f82e82b45e573fc7d93566387e Mon Sep 17 00:00:00 2001 From: bobloy Date: Wed, 1 Sep 2021 14:22:14 -0400 Subject: [PATCH] Better region centering, randomized samples, fixed merge weights, recalculating center, no more data nesting data --- conquest/regioner.py | 69 +++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 65 insertions(+), 4 deletions(-) diff --git a/conquest/regioner.py b/conquest/regioner.py index 101b70e..b236ba8 100644 --- a/conquest/regioner.py +++ b/conquest/regioner.py @@ -2,10 +2,12 @@ import asyncio import json import logging import pathlib +import random import shutil from io import BytesIO from typing import List, Union, Optional +import numpy from PIL import Image, ImageChops, ImageColor, ImageDraw, ImageFont, ImageOps from PIL.ImageDraw import _color_diff @@ -136,8 +138,12 @@ def create_number_mask(regions, filepath, filename): w1, h1 = region.center w2, h2 = fnt.getsize(text) - d2.rectangle((w1 - (w2 / 2), h1 - (h2 / 2)-1, w1 + (w2 / 2)-1, h1 + (h2 / 2)), fill=0) - d3.rectangle((w1 - (w2 / 2), h1 - (h2 / 2)-1, w1 + (w2 / 2)-1, h1 + (h2 / 2)), fill=0) + d2.rectangle( + (w1 - (w2 / 2) - 1, h1 - (h2 / 2) + 5, w1 + (w2 / 2) - 1, h1 + (h2 / 2)), fill=0 + ) + d3.rectangle( + (w1 - (w2 / 2) - 1, h1 - (h2 / 2) + 5, w1 + (w2 / 2) - 1, h1 + (h2 / 2)), fill=0 + ) d3.text((w1 - (w2 / 2), h1 - (h2 / 2)), text, font=fnt, fill=255) d.text((w1 - (w2 / 2), h1 - (h2 / 2)), text, font=fnt, fill=0) number_img.save(filepath / "numbers.png", "PNG") @@ -224,6 +230,31 @@ class ConquestMap: return lowest_num, eliminated_masks, mask + async def sample_region(self, region: int, include_numbered=False): + if region not in self.regions: + return [] + + files = [] + + current_map = Image.open(self.blank_path()) + current_map = await composite_regions( + current_map, [region], ImageColor.getrgb("red"), self.masks_path() + ) + + buffer1 = BytesIO() + current_map.save(buffer1, "png") + buffer1.seek(0) + files.append(buffer1) + + if include_numbered: + current_numbered_img = await self.get_numbered(current_map) + buffer2 = BytesIO() + current_numbered_img.save(buffer2, "png") + buffer2.seek(0) + files.append(buffer2) + + return files + async def get_sample(self, region=None): files = [self.blank_path()] @@ -239,6 +270,8 @@ class ConquestMap: else: regions = list(self.regions.keys()) + random.shuffle(regions) # random lets goo + fourth = len(regions) // 4 current_map = await composite_regions( @@ -257,7 +290,10 @@ class ConquestMap: self.masks_path(), ) current_map = await composite_regions( - current_map, regions[fourth * 3 :], ImageColor.getrgb("yellow"), self.masks_path() + current_map, + regions[fourth * 3 :], + ImageColor.getrgb("yellow"), + self.masks_path(), ) current_numbered_img = await self.get_numbered(current_map) @@ -385,6 +421,7 @@ class MapMaker(ConquestMap): ] lowest_region.center = get_center(weighted_points) + lowest_region.weight += sum(r.weight for r in elim_regions) for key in eliminated: self.regions.pop(key) @@ -439,6 +476,30 @@ class MapMaker(ConquestMap): return True + async def recalculate_center(self, region=None): + if region is None: + for num, r in self.regions.items(): + + points = await self.get_points_from_mask(region) + + r.center = get_center(points) + else: + num = region + r = self.regions[num] + + points = await self.get_points_from_mask(region) + + r.center = get_center(points) + + await self.save_data() + + async def get_points_from_mask(self, region): + mask: Image.Image = Image.open(self.masks_path() / f"{region}.png").convert("1") + arr = numpy.array(mask) + found = numpy.where(arr == 0) + points = set(list(zip(found[1], found[0]))) + return points + class Region: def __init__(self, center, weight, **kwargs): @@ -447,7 +508,7 @@ class Region: self.data = kwargs def get_json(self): - return {"center": self.center, "weight": self.weight, "data": self.data.copy()} + return {"center": self.center, "weight": self.weight, **self.data} class Regioner: