From 5051071d1da159b03f6ce262053d5b85ca94a9f5 Mon Sep 17 00:00:00 2001 From: Eclairsombre Date: Sun, 28 Apr 2024 19:27:38 +0200 Subject: [PATCH] update roof --- House.py | 249 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 220 insertions(+), 29 deletions(-) diff --git a/House.py b/House.py index 903d04a..2376ac4 100644 --- a/House.py +++ b/House.py @@ -4,6 +4,7 @@ from gdpc import Editor, Block, geometry from list_block import * import numpy as np from skimage.morphology import skeletonize +import math import matplotlib.pyplot as plt class House: @@ -14,8 +15,14 @@ class House: self.grid = np.zeros((coordinates_max[0], coordinates_max[2]), dtype=[('bool', bool), ('int', int)]) self.skeleton = [] + size = [(coordinates_max[i] - coordinates_min[i]) + 10 for i in range(3)] + + # Créer le tableau + self.grid3d = np.zeros(size, dtype=[('bool', bool), ('int', int)]) + self.nbEtage = (coordinates_max[1] - coordinates_min[1]) // 5 + def createHouseSkeleton(self): self.delete() x_min, y_min, z_min = self.coordinates_min @@ -41,17 +48,22 @@ class House: width = perimeter_width // 2 depth = perimeter_depth // 2 + height = y_max - y_min if x + width-1 > x_max-1: x = x_max - width-1 if z + depth-1 > z_max-1: z = z_max - depth-1 + + x_plan3d = x - x_min + z_plan3d = z - z_min for i in range(0, width-1): for j in range(0, depth-1): self.editor.placeBlock((x + i, y_min, z + j), Block("stone")) self.grid[x+i,z+j] = True,1 - self.skeleton.append((x, z, width-1, depth-1)) + self.grid3d[x_plan3d+i,0,z_plan3d+j] = True,1 + self.skeleton.append((x, z, width-1, depth-1, height)) print("Coordinates of the corners: ", (x, z), (x, z+depth-1), (x+width-1, z), (x+width-1, z+depth-1)) block = ["redstone_block", "gold_block", "diamond_block"] @@ -63,11 +75,7 @@ class House: for _ in range(3): print("Rectangle n°", _+1, "en cours de création") - corners = [(x-1, z-1), (x-1, z+depth-1), (x+width-1, z-1), (x+width-1, z+depth-1)] - around_corners = [(x-1, z),(x, z-1), (x-1, z+depth-2),(x, z+depth-1), (x+width-2, z-1),(x+width-1, z), (x+width-1, z+depth-2),(x+width-2, z+depth-1)] - around_around_corners = [(x-1, z+1), (x+1, z-1), (x-1, z+depth-3), (x+1, z+depth-1), (x+width-3, z-1), (x+width-1, z+1), (x+width-1, z+depth-3), (x+width-3, z+depth-1)] - corners = corners + around_corners + around_around_corners for a in range(100000): new_width = np.random.randint(5, width-2) @@ -77,10 +85,7 @@ class House: new_z = np.random.randint(max(z_min+1, z - new_depth), min(z_max-new_depth - 1, z + depth )) - #if (new_x, new_z) in corners or(new_x+new_width-1, new_z) in corners or (new_x, new_z+new_depth-1) in corners or (new_x+new_width-1, new_z+new_depth-1) in corners: - # continue - - # Check if the majority of the small rectangle is adjacent to the first rectangle + adjacent_blocks = 0 for i in range(new_x, new_x + new_width): for j in range(new_z, new_z + new_depth): @@ -91,16 +96,19 @@ class House: continue if not np.any(self.grid[new_x:new_x+new_width, new_z:new_z+new_depth]['bool']): + new_x_plan3d = new_x - x_min + new_z_plan3d = new_z - z_min for i in range(0, new_width): for j in range(0, new_depth): self.grid[new_x + i, new_z + j] = True,2 + self.grid3d[new_x_plan3d + i,0, new_z_plan3d + j] = True,2 if i == 0 or i == new_width-1 or j == 0 or j == new_depth-1: continue else: self.editor.placeBlock((new_x + i, y_min, new_z + j), Block(block[_])) - self.skeleton.append((new_x, new_z, new_width, new_depth)) + self.skeleton.append((new_x, new_z, new_width, new_depth, height)) break else: print("Failed to place rectangle after 1000 attempts.") @@ -108,36 +116,42 @@ class House: def delete(self): for x in range(self.coordinates_min[0], self.coordinates_max[0]): - for y in range(self.coordinates_min[1], self.coordinates_max[1]+4): + for y in range(self.coordinates_min[1], self.coordinates_max[1]+10): for z in range(self.coordinates_min[2], self.coordinates_max[2]): self.editor.placeBlock((x, y, z), Block("air")) def putWallOnSkeleton(self): for k in range(len(self.skeleton)): - x, z, width, depth = self.skeleton[k] + x, z, width, depth, height = self.skeleton[k] + + if k!= 0: x+=1 z+=1 width-=2 depth-=2 + x_plan3d = x - self.coordinates_min[0] + z_plan3d = z - self.coordinates_min[2] for i in range(-1, width+1): for j in range(-1, depth+1): - for y in range(self.coordinates_min[1], self.coordinates_max[1]): + for y in range(0, height): if i == -1 or i == width or j == -1 or j == depth: if not (self.grid[x + i, z + j]['bool']) and not (self.grid[x + i, z + j]['int'] == 1) or (self.grid[x + i, z + j]['bool'] and self.grid[x + i, z + j]['int'] == 2): - self.editor.placeBlock((x + i, y, z + j), Block("stone")) + self.editor.placeBlock((x + i, self.coordinates_min[1] + y, z + j), Block("stone")) + self.grid3d[ x_plan3d+i, y, z_plan3d+j] = True #print( i, y, j, self.grid[x + i, z + j]['bool'],self.grid[x + i, z + j]['int']) def getAdjacentWalls(self): main_rect = self.skeleton[0] - x_main, z_main, width_main, depth_main = main_rect + x_main, z_main, width_main, depth_main, heigt_main = main_rect adjacent_walls = [] width_main-=1 depth_main-=1 for k in range(1, len(self.skeleton)): - x, z, width, depth = self.skeleton[k] + x, z, width, depth, heigt = self.skeleton[k] + walls = [(x, z, x + width-1, z), (x, z, x, z + depth-1), (x, z + depth-1, x + width-1, z + depth-1), (x + width-1, z, x + width-1, z + depth-1)] for wall in walls: @@ -189,26 +203,75 @@ class House: def placeRoof(self): for k in range(len(self.skeleton)-1, -1, -1): - x, z, width, depth = self.skeleton[k] + x, z, width, depth, height = self.skeleton[k] + + if k!= 0: x+=1 z+=1 width-=2 depth-=2 - n=1 + if width < depth: + if width <=5: + n = 1 + elif width <=10: + n = 2 + else: + n = 3 + else: + if depth <=5: + n = 1 + elif depth <=10: + n = 2 + else: + n = 3 else: - n=2 + + if width < depth: + n = width // 4 + else: + n = depth // 4 + + + x_plan3d = x - self.coordinates_min[0] + z_plan3d = z - self.coordinates_min[2] for i in range(-1, width+1): for j in range(-1, depth+1): if width