diff --git a/frutiloop.py b/frutiloop.py new file mode 100644 index 0000000..4005231 --- /dev/null +++ b/frutiloop.py @@ -0,0 +1,257 @@ +import random +from PIL import Image, ImageOps +import os +import glob + +import numpy as np + +from datetime import datetime + +def print_map(map_: list): + for idx_columna, columna in enumerate(map_): + for fila in columna: + print(" ", fila["a"], fila["b"], " ", end=' ') + print() + for fila in columna: + print(fila["h"], "x", "x", fila["c"], end=' ') + print() + for fila in columna: + print(fila["g"], "x", "x", fila["d"], end=' ') + print() + for fila in columna: + print(" ", fila["f"], fila["e"], " ", end=' ') + print() + print() + + +def tile(overrides: dict[str, str] = {}): + agua_weight = 4 + tierra_weight = 5 + t = { + "a": random.choice(["a"] * agua_weight + ["t"] * tierra_weight), + "b": random.choice(["a"] * agua_weight + ["t"] * tierra_weight), + "c": random.choice(["a"] * agua_weight + ["t"] * tierra_weight), + "d": random.choice(["a"] * agua_weight + ["t"] * tierra_weight), + "e": random.choice(["a"] * agua_weight + ["t"] * tierra_weight), + "f": random.choice(["a"] * agua_weight + ["t"] * tierra_weight), + "g": random.choice(["a"] * agua_weight + ["t"] * tierra_weight), + "h": random.choice(["a"] * agua_weight + ["t"] * tierra_weight), + } | overrides + path = os.path.exists("tiles/"+tile2filename(t)) + if not path: + return tile(overrides) + return t + + + +def empty_tile(): + return { + "a": "?", + "b": "?", + "c": "?", + "d": "?", + "e": "?", + "f": "?", + "g": "?", + "h": "?", + } + +def tile2filename(tile): + top = tile["a"] + tile["b"] + if len(set(top)) == 1: + top = top[0] + right = tile["c"] + tile["d"] + if len(set(right)) == 1: + right = right[0] + bottom = tile["e"] + tile["f"] + if len(set(bottom)) == 1: + bottom = bottom[0] + left = tile["g"] + tile["h"] + if len(set(left)) == 1: + left = left[0] + return '-'.join([top, right, bottom, left]) + ".jpg" + + +def get_concat_h(im1, im2): + dst = Image.new('RGB', (im1.width + im2.width, im1.height)) + dst.paste(im1, (0, 0)) + dst.paste(im2, (im1.width, 0)) + return dst + + +def get_concat_v(im1, im2): + dst = Image.new('RGB', (im1.width, im1.height + im2.height)) + dst.paste(im1, (0, 0)) + dst.paste(im2, (0, im1.height)) + return dst + + +def pick_equal_picture(filename): + r = random.choice(glob.glob(f"tiles/{filename.split('.')[0]}-*") + [filename]) + return r.split("/")[-1] + + +def generate_final_map(map_): + img_map = [] + for row in map_: + img_map_row = [] + for tile in row: + # img_map_row.append(tile2filename(tile)) + img_map_row.append(pick_equal_picture(tile2filename(tile))) + img_map.append(img_map_row) + row_images = [] + for row in img_map: + row_final = Image.open(os.path.join('tiles/', row[0])) + for idx, tile in enumerate(row[1:]): + tile_img = Image.open(os.path.join('tiles/', tile)) + row_final = get_concat_h(row_final, tile_img) + row_images.append(row_final) + final = row_images[0] + for row in row_images[1:]: + final = get_concat_v(final, row) + map_name = f"frutimap__{len(map_)}x{len(map_[0])}__{datetime.now().isoformat()}.jpg" + final.save(map_name) + + print(f"file:///{os.getcwd()}/{map_name}") + +def water_tile(): + return {k: "a" for k in "abcdefgh"} + +def fruti(l: int): + map_ = [] + for i in range(l): + row = [] + for j in range(l): + row.append(empty_tile()) + map_.append(row) + water = np.zeros((l, l)) + water[int(l/2), :] = 1 + # water[:, int(l/2)] = 1 + for idx_row, row in enumerate(map_): + for idx_col, tile in enumerate(row): + # if water[idx_col, idx_row] == 1: + # map_[idx_row][idx_col] = water_tile() + # update_tile(map_, idx_row, idx_col-1) + # # update_tile(map_, idx_row-1, idx_col) + # else: + # update_tile(map_, idx_row, idx_col) + update_tile(map_, idx_row, idx_col) + print_map(map_) + generate_final_map(map_) + + +def update_tile(map_, idx_row, idx_col): + overrides = {} + # LEFT + if idx_col - 1 >= 0: + left = map_[idx_row][idx_col - 1] + if "?" not in left.values(): + overrides.update({ + "h": left["c"], + "g": left["d"], + }) + # RIGHT + if idx_col+1 < len(map_[idx_row])-1: + right = map_[idx_row][idx_col+1] + if "?" not in right.values(): + overrides.update({ + "c": right["h"], + "d": right["g"], + }) + # UP + if idx_row - 1 >= 0: + up = map_[idx_row-1][idx_col] + if "?" not in up.values(): + overrides.update({ + "a": up["f"], + "b": up["e"], + }) + # DOWN + if idx_row+1 < len(map_)-1: + down = map_[idx_row+1][idx_col] + if "?" not in down.values(): + overrides.update({ + "f": down["a"], + "e": down["b"], + }) + + map_[idx_row][idx_col] = tile(overrides) + return map_ + + + +def rotate(path:str, filename: str, times: int = 1, ): + """rotate the images 90 degrees per time""" + filename = filename.replace(path, "") + sides = filename.split(".")[0].split('-')[:4] + for i in range(times): + sides.insert(0, sides.pop()) + im = Image.open(os.path.join(path, filename)) + im_rotated = im.rotate(-90*times,) + im_rotated.save( + os.path.join( + path, "-".join(sides)+".jpg" + ) + ) + +def flip(path:str, filename: str, ): + filename = filename.replace(path, "") + sides = filename.split(".")[0].split('-')[:4] + new = [""] * 4 + new[0], new[2] = sides[2][::-1], sides[0][::-1] + new[1] = sides[1][::-1] + new[3] = sides[3][::-1] + im = Image.open(os.path.join(path, filename)) + im_flip = ImageOps.flip(im) + im_flip.save( + os.path.join( + path, "-".join(new)+".jpg" + ) + ) + +def mirror(path:str, filename: str, ): + filename = filename.replace(path, "") + sides = filename.split(".")[0].split('-')[:4] + print(sides) + new = [ + sides[0][::-1], + sides[3][::-1], + sides[2][::-1], + sides[1][::-1] + ] + # new = [""] * 4 + # new[1], new[3] = sides[1][::-1], sides[3][::-1] + # new[0] = sides[0][::-1] + # new[2] = sides[2][::-1] + im = Image.open(os.path.join(path, filename)) + im_flip = ImageOps.mirror(im) + im_flip.save( + os.path.join( + path, "-".join(new)+".jpg" + ) + ) + + +def generate_rotated_img(): + for jpg_version in ["jpg", "JPG"]: + for f in glob.glob(f"tiles/*.{jpg_version}"): + # rotate("tiles/", f) + # rotate("tiles/", f, times=2) + # rotate("tiles/", f, times=3) + # mirror("tiles/", f) + # flip("tiles/", f) + pass + + +if __name__ == "__main__": + # generate_rotated_img() + l = 15 + i = 0 + while True: + i += 1 + try: + fruti(l) + break + except Exception: + print(f"starting over... {i}", end="\r") + continue diff --git a/main.py b/main.py new file mode 100644 index 0000000..1aceecc --- /dev/null +++ b/main.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +""" +Created on Sat Mar 30 18:30:01 2024 + +@author: Mapmaking Team PyCamp Spain 2024 +""" +import os, sys +from PIL import Image +from os import listdir +from os.path import isfile, join + +class Tile: + def __init__( + self, + image_list, + frontier_list, + special = '', + rotable = True, + symmetric = False, + ): + self.image_list = image_list + self.frontier_list = frontier_list + self.rotable = rotable + self.symmetric = symmetric + self.special = special + + def is_compatible_with(self, other_tile, other_position = 'up'): + if other_position == 'up': + my_frontier = self.frontier_list[0] + their_frontier = other_tile.frontier_list[2] + elif other_position == 'down': + my_frontier = self.frontier_list[2] + their_frontier = other_tile.frontier_list[0] + elif other_position == 'right': + my_frontier = self.frontier_list[1] + their_frontier = other_tile.frontier_list[3] + elif other_position == 'left': + my_frontier = self.frontier_list[3] + their_frontier = other_tile.frontier_list[1] + else: + raise ValueError(f'invalid value for other position: {other_position}') + return my_frontier == their_frontier[::-1] + + +def frontiers_from_name(fname): + fname = fname.partition('.')[0] + frontiers = [] + for ii in range(3): + _f, _, fname = fname.partition('-') + frontiers.append(_f) + if '-' in fname: + _f, _, special = fname.partition('-') + frontiers.append(_f) + else: + frontiers.append(fname) + special = '' + return frontiers, special + + +def rotate_frontier_list(old_frontier_list): + new_frontier_list = [_front for _front in old_frontier_list[1:]] + new_frontier_list.append(old_frontier_list[0]) + return new_frontier_list +def is_simmetric(frontier_list): + base_string = '-'.join(frontier_list) + inverse_list = [_f[::-1] for _f in frontier_list[::-1]] + #print(base_string) + for ii in range(4): + inverse_string = '-'.join(inverse_list) + #print(inverse_string) + if inverse_string == base_string: + return True + inverse_list = rotate_frontier_list(inverse_list) + return False + + +def tile_from_file(fname, pathname): + frontiers, special = frontiers_from_name(fname) + fpath = join(pathname, fname) + im = Image.open(fpath) + if special == '': + rotable = True + else: + rotable = False + + newtile = Tile( + image_list = [im,], + frontier_list = frontiers, + special = special, + rotable = rotable, + symmetric = False, + ) + return newtile + + +def rotate_tile(oldtile): + old_im_list = oldtile.image_list + old_frontier_list = oldtile.frontier_list + new_im_list = [_im.rotate(-90) for _im in old_im_list] + new_frontier_list = [old_frontier_list[-1]] + [_front for _front in old_frontier_list[:-1]] + newtile = Tile( + new_im_list, + new_frontier_list, + special = oldtile.special, + rotable = oldtile.rotable, + symmetric = oldtile.symmetric, + ) + return newtile + +def flip_tile(oldtile): + old_im_list = oldtile.image_list + old_frontier_list = oldtile.frontier_list + new_im_list = [_im.transpose(Image.Transpose.FLIP_LEFT_RIGHT) for _im in old_im_list] + new_frontier_list = [_front[::-1] for _front in old_frontier_list] + new_frontier_list[1] = old_frontier_list[3][::-1] + new_frontier_list[3] = old_frontier_list[1][::-1] + newtile = Tile( + new_im_list, + new_frontier_list, + special = oldtile.special, + rotable = oldtile.rotable, + symmetric = oldtile.symmetric, + ) + return newtile + + +def create_tile_list(pathname): + file_list = [f for f in listdir(pathname) if isfile(join(pathname, f))] + tile_list = [] + for file in file_list: + new_tile = tile_from_file(file, pathname) + tile_list.append(new_tile) + if new_tile.rotable == True: + for ii in range(3): + new_tile = rotate_tile(new_tile) + tile_list.append(new_tile) + if not is_simmetric(new_tile.frontier_list): + new_tile = flip_tile(new_tile) + tile_list.append(new_tile) + if new_tile.rotable == True: + for ii in range(3): + new_tile = rotate_tile(new_tile) + tile_list.append(new_tile) + return tile_list + + +def generate_final_image(image_names: list[list], width: int, height: int): + final_image = Image.new('RGB', (width * 64, height * 64)) + for x, image_name_row in enumerate(image_names): + for y, image_name in enumerate(image_name_row): + image = Image.open(f'tiles/{image_name}') + final_image.paste(image, (y * 64, x * 64)) + + final_image.save('final_image.png', 'JPEG') + +if __name__ == '__main__': + image_names = [ + [ + 'a-a-a-a.jpg', + 'a-a-a-a-ballena.jpg', + 'a-a-a-a-barco.jpg', + ], + [ + 'a-t-a-t-canal.jpg', + 'a-t-a-t-istmo.JPG', + 't-a-a-a.jpg', + ], + [ + 't-t-a-a.jpg', + 't-t-t-a.jpg', + 't-t-t-t.jpg', + ], + ] + + generate_final_image(image_names, 3, 3) \ No newline at end of file diff --git a/tiles/a-a-a-a.jpg b/tiles/a-a-a-a.jpg index 176eb50..2f4a58c 100644 Binary files a/tiles/a-a-a-a.jpg and b/tiles/a-a-a-a.jpg differ diff --git a/tiles/a-a-a-at.jpg b/tiles/a-a-a-at.jpg new file mode 100644 index 0000000..e324c25 Binary files /dev/null and b/tiles/a-a-a-at.jpg differ diff --git a/tiles/a-a-a-t.jpg b/tiles/a-a-a-t.jpg new file mode 100644 index 0000000..3ae149f Binary files /dev/null and b/tiles/a-a-a-t.jpg differ diff --git a/tiles/a-a-a-ta.jpg b/tiles/a-a-a-ta.jpg new file mode 100644 index 0000000..ec73769 Binary files /dev/null and b/tiles/a-a-a-ta.jpg differ diff --git a/tiles/a-a-at-a.jpg b/tiles/a-a-at-a.jpg new file mode 100644 index 0000000..b36a000 Binary files /dev/null and b/tiles/a-a-at-a.jpg differ diff --git a/tiles/a-a-at-t.jpg b/tiles/a-a-at-t.jpg new file mode 100644 index 0000000..121c708 Binary files /dev/null and b/tiles/a-a-at-t.jpg differ diff --git a/tiles/a-a-at-ta.jpg b/tiles/a-a-at-ta.jpg new file mode 100644 index 0000000..bf5553c Binary files /dev/null and b/tiles/a-a-at-ta.jpg differ diff --git a/tiles/a-a-t-a.jpg b/tiles/a-a-t-a.jpg new file mode 100644 index 0000000..71fcd51 Binary files /dev/null and b/tiles/a-a-t-a.jpg differ diff --git a/tiles/a-a-t-t.jpg b/tiles/a-a-t-t.jpg new file mode 100644 index 0000000..6d64be0 Binary files /dev/null and b/tiles/a-a-t-t.jpg differ diff --git a/tiles/a-a-t-ta.jpg b/tiles/a-a-t-ta.jpg new file mode 100644 index 0000000..5dd8844 Binary files /dev/null and b/tiles/a-a-t-ta.jpg differ diff --git a/tiles/a-a-ta-a.jpg b/tiles/a-a-ta-a.jpg new file mode 100644 index 0000000..9dc2007 Binary files /dev/null and b/tiles/a-a-ta-a.jpg differ diff --git a/tiles/a-at-a-a.jpg b/tiles/a-at-a-a.jpg new file mode 100644 index 0000000..00517c7 Binary files /dev/null and b/tiles/a-at-a-a.jpg differ diff --git a/tiles/a-at-t-a.jpg b/tiles/a-at-t-a.jpg new file mode 100644 index 0000000..5134617 Binary files /dev/null and b/tiles/a-at-t-a.jpg differ diff --git a/tiles/a-at-t-t.jpg b/tiles/a-at-t-t.jpg new file mode 100644 index 0000000..ed7764f Binary files /dev/null and b/tiles/a-at-t-t.jpg differ diff --git a/tiles/a-at-t-ta.jpg b/tiles/a-at-t-ta.jpg new file mode 100644 index 0000000..5432d32 Binary files /dev/null and b/tiles/a-at-t-ta.jpg differ diff --git a/tiles/a-at-ta-a.jpg b/tiles/a-at-ta-a.jpg new file mode 100644 index 0000000..04d2955 Binary files /dev/null and b/tiles/a-at-ta-a.jpg differ diff --git a/tiles/a-t-a-a.jpg b/tiles/a-t-a-a.jpg new file mode 100644 index 0000000..73dd1fb Binary files /dev/null and b/tiles/a-t-a-a.jpg differ diff --git a/tiles/a-t-a-t.JPG b/tiles/a-t-a-t.JPG new file mode 100644 index 0000000..d4ef658 Binary files /dev/null and b/tiles/a-t-a-t.JPG differ diff --git a/tiles/a-t-a-t.jpg b/tiles/a-t-a-t.jpg new file mode 100644 index 0000000..0776c1e Binary files /dev/null and b/tiles/a-t-a-t.jpg differ diff --git a/tiles/a-t-t-a.jpg b/tiles/a-t-t-a.jpg new file mode 100644 index 0000000..cac0787 Binary files /dev/null and b/tiles/a-t-t-a.jpg differ diff --git a/tiles/a-t-t-t.jpg b/tiles/a-t-t-t.jpg new file mode 100644 index 0000000..dad2e8c Binary files /dev/null and b/tiles/a-t-t-t.jpg differ diff --git a/tiles/a-t-t-ta.jpg b/tiles/a-t-t-ta.jpg new file mode 100644 index 0000000..7a78464 Binary files /dev/null and b/tiles/a-t-t-ta.jpg differ diff --git a/tiles/a-t-ta-a.jpg b/tiles/a-t-ta-a.jpg new file mode 100644 index 0000000..25103cc Binary files /dev/null and b/tiles/a-t-ta-a.jpg differ diff --git a/tiles/a-ta-a-a.jpg b/tiles/a-ta-a-a.jpg new file mode 100644 index 0000000..725685d Binary files /dev/null and b/tiles/a-ta-a-a.jpg differ diff --git a/tiles/at-a-a-a.jpg b/tiles/at-a-a-a.jpg new file mode 100644 index 0000000..4810d17 Binary files /dev/null and b/tiles/at-a-a-a.jpg differ diff --git a/tiles/at-t-a-a.jpg b/tiles/at-t-a-a.jpg new file mode 100644 index 0000000..44f0023 Binary files /dev/null and b/tiles/at-t-a-a.jpg differ diff --git a/tiles/at-t-t-a.jpg b/tiles/at-t-t-a.jpg new file mode 100644 index 0000000..1cf2d08 Binary files /dev/null and b/tiles/at-t-t-a.jpg differ diff --git a/tiles/at-t-t-t.jpg b/tiles/at-t-t-t.jpg new file mode 100644 index 0000000..b775a36 Binary files /dev/null and b/tiles/at-t-t-t.jpg differ diff --git a/tiles/at-t-t-ta.jpg b/tiles/at-t-t-ta.jpg new file mode 100644 index 0000000..160302c Binary files /dev/null and b/tiles/at-t-t-ta.jpg differ diff --git a/tiles/at-t-ta-a.jpg b/tiles/at-t-ta-a.jpg new file mode 100644 index 0000000..536f3ae Binary files /dev/null and b/tiles/at-t-ta-a.jpg differ diff --git a/tiles/at-ta-a-a.jpg b/tiles/at-ta-a-a.jpg new file mode 100644 index 0000000..143019f Binary files /dev/null and b/tiles/at-ta-a-a.jpg differ diff --git a/tiles/t-a-a-a.jpg b/tiles/t-a-a-a.jpg index e31f3af..7f8706a 100644 Binary files a/tiles/t-a-a-a.jpg and b/tiles/t-a-a-a.jpg differ diff --git a/tiles/t-a-a-at.jpg b/tiles/t-a-a-at.jpg new file mode 100644 index 0000000..5f4cc2f Binary files /dev/null and b/tiles/t-a-a-at.jpg differ diff --git a/tiles/t-a-a-t.jpg b/tiles/t-a-a-t.jpg new file mode 100644 index 0000000..34ad057 Binary files /dev/null and b/tiles/t-a-a-t.jpg differ diff --git a/tiles/t-a-at-t.jpg b/tiles/t-a-at-t.jpg new file mode 100644 index 0000000..167fc0b Binary files /dev/null and b/tiles/t-a-at-t.jpg differ diff --git a/tiles/t-a-t-a.jpg b/tiles/t-a-t-a.jpg new file mode 100644 index 0000000..14081a2 Binary files /dev/null and b/tiles/t-a-t-a.jpg differ diff --git a/tiles/t-a-t-t.jpg b/tiles/t-a-t-t.jpg new file mode 100644 index 0000000..6d64f61 Binary files /dev/null and b/tiles/t-a-t-t.jpg differ diff --git a/tiles/t-at-t-t.jpg b/tiles/t-at-t-t.jpg new file mode 100644 index 0000000..e96abd8 Binary files /dev/null and b/tiles/t-at-t-t.jpg differ diff --git a/tiles/t-t-a-at.jpg b/tiles/t-t-a-at.jpg new file mode 100644 index 0000000..e8c13bc Binary files /dev/null and b/tiles/t-t-a-at.jpg differ diff --git a/tiles/t-t-a-t.jpg b/tiles/t-t-a-t.jpg new file mode 100644 index 0000000..5d9afce Binary files /dev/null and b/tiles/t-t-a-t.jpg differ diff --git a/tiles/t-t-at-t.jpg b/tiles/t-t-at-t.jpg new file mode 100644 index 0000000..2b40101 Binary files /dev/null and b/tiles/t-t-at-t.jpg differ diff --git a/tiles/t-t-t-a.jpg b/tiles/t-t-t-a.jpg index 98aa6e7..8f9aff9 100644 Binary files a/tiles/t-t-t-a.jpg and b/tiles/t-t-t-a.jpg differ diff --git a/tiles/t-t-t-at.jpg b/tiles/t-t-t-at.jpg new file mode 100644 index 0000000..b679584 Binary files /dev/null and b/tiles/t-t-t-at.jpg differ diff --git a/tiles/t-t-t-t.jpg b/tiles/t-t-t-t.jpg index bc0c178..55448cc 100644 Binary files a/tiles/t-t-t-t.jpg and b/tiles/t-t-t-t.jpg differ diff --git a/tiles/t-t-ta-t.jpg b/tiles/t-t-ta-t.jpg new file mode 100644 index 0000000..f52ef7b Binary files /dev/null and b/tiles/t-t-ta-t.jpg differ diff --git a/tiles/t-ta-a-at.jpg b/tiles/t-ta-a-at.jpg index 4141a3b..fbb3ad3 100644 Binary files a/tiles/t-ta-a-at.jpg and b/tiles/t-ta-a-at.jpg differ diff --git a/tiles/t-ta-a-t.jpg b/tiles/t-ta-a-t.jpg new file mode 100644 index 0000000..89955ec Binary files /dev/null and b/tiles/t-ta-a-t.jpg differ diff --git a/tiles/t-ta-at-t.jpg b/tiles/t-ta-at-t.jpg new file mode 100644 index 0000000..d408425 Binary files /dev/null and b/tiles/t-ta-at-t.jpg differ diff --git a/tiles/t-ta-t-t.jpg b/tiles/t-ta-t-t.jpg new file mode 100644 index 0000000..6ca7cc2 Binary files /dev/null and b/tiles/t-ta-t-t.jpg differ diff --git a/tiles/ta-a-a-t.jpg b/tiles/ta-a-a-t.jpg new file mode 100644 index 0000000..bbfb9b0 Binary files /dev/null and b/tiles/ta-a-a-t.jpg differ diff --git a/tiles/ta-a-at-t.jpg b/tiles/ta-a-at-t.jpg new file mode 100644 index 0000000..c8c2c98 Binary files /dev/null and b/tiles/ta-a-at-t.jpg differ diff --git a/tiles/ta-a-t-t.jpg b/tiles/ta-a-t-t.jpg new file mode 100644 index 0000000..108d556 Binary files /dev/null and b/tiles/ta-a-t-t.jpg differ diff --git a/tiles/ta-at-t-t.jpg b/tiles/ta-at-t-t.jpg new file mode 100644 index 0000000..5c9292c Binary files /dev/null and b/tiles/ta-at-t-t.jpg differ diff --git a/tiles/ta-t-t-t.jpg b/tiles/ta-t-t-t.jpg new file mode 100644 index 0000000..ac1a5ec Binary files /dev/null and b/tiles/ta-t-t-t.jpg differ