Compare commits
No commits in common. "d9a6967c2170a7fcbbaf374a262a66e74efa6dc9" and "96c893023977f9eda940ceb62c694de0f39ef076" have entirely different histories.
d9a6967c21
...
96c8930239
1 changed files with 0 additions and 182 deletions
182
2d_sponge.py
182
2d_sponge.py
|
@ -1,182 +0,0 @@
|
||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
import pygame
|
|
||||||
import threading
|
|
||||||
|
|
||||||
RESOLUTION = 8
|
|
||||||
FPS = 60
|
|
||||||
|
|
||||||
|
|
||||||
pygame.init()
|
|
||||||
|
|
||||||
screen = pygame.display.set_mode((1600, 900), flags=pygame.RESIZABLE)
|
|
||||||
|
|
||||||
|
|
||||||
white = (240, 240, 240)
|
|
||||||
red = (200, 40, 40)
|
|
||||||
gray = (40, 40, 40)
|
|
||||||
|
|
||||||
sponge = None
|
|
||||||
sponge_step = 0
|
|
||||||
sponge_last_step = (RESOLUTION - 1) * 3 * 3
|
|
||||||
|
|
||||||
|
|
||||||
clock = pygame.time.Clock()
|
|
||||||
sponge_surface = pygame.Surface((3**RESOLUTION, 3**RESOLUTION))
|
|
||||||
sponge_surface.fill(gray)
|
|
||||||
font = pygame.font.Font(pygame.font.get_default_font(), 32)
|
|
||||||
|
|
||||||
|
|
||||||
class SimpleArray:
|
|
||||||
def __init__(self, size: tuple, fill=None):
|
|
||||||
self.size = size
|
|
||||||
self.width, self.height = size
|
|
||||||
|
|
||||||
self.fill = fill
|
|
||||||
|
|
||||||
self.array = []
|
|
||||||
self.empty_array = []
|
|
||||||
|
|
||||||
self.create_array()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
array_string = ""
|
|
||||||
|
|
||||||
for y in self.array:
|
|
||||||
for x in y:
|
|
||||||
array_string += str(x)
|
|
||||||
|
|
||||||
array_string += "\n"
|
|
||||||
|
|
||||||
return array_string
|
|
||||||
|
|
||||||
def create_array(self):
|
|
||||||
for y in range(self.height):
|
|
||||||
array = []
|
|
||||||
for x in range(self.width):
|
|
||||||
array.append(self.fill)
|
|
||||||
|
|
||||||
self.array.append(array)
|
|
||||||
|
|
||||||
self.empty_array = self.array
|
|
||||||
|
|
||||||
def set(self, pos: tuple, value):
|
|
||||||
x, y = pos
|
|
||||||
|
|
||||||
self.array[y - 1][x - 1] = value
|
|
||||||
|
|
||||||
def set_all(self, array: list):
|
|
||||||
self.array = array
|
|
||||||
|
|
||||||
def merge(self, pos: tuple, array):
|
|
||||||
width, height = array.size
|
|
||||||
|
|
||||||
offset_x, offset_y = pos
|
|
||||||
|
|
||||||
for y in range(height):
|
|
||||||
for x in range(width):
|
|
||||||
self.set((x + offset_x + 1, y + offset_y + 1), array.get((x + 1, y + 1)))
|
|
||||||
|
|
||||||
def get(self, pos: tuple):
|
|
||||||
x, y = pos
|
|
||||||
|
|
||||||
return self.array[y - 1][x - 1]
|
|
||||||
|
|
||||||
def get_all(self):
|
|
||||||
return self.array
|
|
||||||
|
|
||||||
def reset(self):
|
|
||||||
self.array = self.empty_array
|
|
||||||
|
|
||||||
|
|
||||||
def generate_sponge():
|
|
||||||
global sponge
|
|
||||||
global sponge_step
|
|
||||||
|
|
||||||
pattern = SimpleArray((1, 1), fill=1)
|
|
||||||
|
|
||||||
for pattern_number in range(2, RESOLUTION + 1):
|
|
||||||
if not running:
|
|
||||||
return
|
|
||||||
|
|
||||||
old_size = pattern.height
|
|
||||||
new_size = old_size * 3
|
|
||||||
|
|
||||||
new_pattern = SimpleArray((new_size, new_size), fill=0)
|
|
||||||
|
|
||||||
for y in range(1, 4):
|
|
||||||
for x in range(1, 4):
|
|
||||||
if not x == 2 or not y == 2:
|
|
||||||
new_pattern.merge((x * old_size - old_size, y * old_size - old_size), pattern)
|
|
||||||
|
|
||||||
sponge_step += 1
|
|
||||||
|
|
||||||
pattern = new_pattern
|
|
||||||
|
|
||||||
sponge = pattern
|
|
||||||
|
|
||||||
draw_sponge()
|
|
||||||
|
|
||||||
|
|
||||||
def draw_sponge():
|
|
||||||
global sponge_step
|
|
||||||
|
|
||||||
sponge_surface.fill(gray)
|
|
||||||
|
|
||||||
for y in range(3**(RESOLUTION - 1)):
|
|
||||||
for x in range(3**(RESOLUTION - 1)):
|
|
||||||
if sponge.get((x + 1, y + 1)) == 1:
|
|
||||||
sponge_surface.set_at((x, y), white)
|
|
||||||
|
|
||||||
|
|
||||||
def update():
|
|
||||||
screen.fill(gray)
|
|
||||||
|
|
||||||
screen.blit(sponge_surface, (0, 0))
|
|
||||||
|
|
||||||
calculate_progress()
|
|
||||||
|
|
||||||
check_events()
|
|
||||||
|
|
||||||
if not running:
|
|
||||||
return
|
|
||||||
|
|
||||||
pygame.display.update()
|
|
||||||
|
|
||||||
|
|
||||||
def calculate_progress():
|
|
||||||
if not sponge_step == sponge_last_step:
|
|
||||||
percent = 100 / sponge_last_step
|
|
||||||
step_percent = round(percent * sponge_step)
|
|
||||||
|
|
||||||
loading_text = font.render("Loading: " + str(step_percent) + "%", True, red)
|
|
||||||
|
|
||||||
x, y = screen.get_size()
|
|
||||||
tx, ty = loading_text.get_size()
|
|
||||||
|
|
||||||
screen.blit(loading_text, (x / 2 - tx / 2, y / 2 - ty / 2))
|
|
||||||
|
|
||||||
|
|
||||||
def check_events():
|
|
||||||
for event in pygame.event.get():
|
|
||||||
if event.type == pygame.QUIT:
|
|
||||||
close()
|
|
||||||
|
|
||||||
|
|
||||||
def close():
|
|
||||||
global running
|
|
||||||
|
|
||||||
running = False
|
|
||||||
|
|
||||||
|
|
||||||
running = True
|
|
||||||
|
|
||||||
threading.Thread(target=generate_sponge).start()
|
|
||||||
|
|
||||||
while running:
|
|
||||||
update()
|
|
||||||
|
|
||||||
clock.tick(FPS)
|
|
||||||
|
|
||||||
pygame.quit()
|
|
||||||
print("Exit.")
|
|
Loading…
Reference in a new issue