Bueno se me ha dado por probar de nuevo la matemática entretenida y como resultado he terminado haciendo un fractal; el primero que hice hace mucho tiempo, la "Curva Del Dragón".
#!/usr/bin/env python # -*- coding: utf-8 -*- # fDragon.py # Fractal de la "Curva Del Dragón" # 2011 - 10 - 14 # http://dakuregashi.blogspot.com/ import sys # Control del sistema import time # Control del tiempo import pygame # Graficas y control de eventos from pygame.locals import * # Constates def genPoint(old): # Generador de coordenadas new = [] # Lista vacia para nuevos puntos i = 0 # Contador de control tok = -1 # Indica la direccion de la fractura lim = len(old) # Cantidad de segmentos a evaluar while(i < lim-1): # Repita mientras queden segmentos por evaluar new.append(old[i]) # Agrega el punto de inicio a la nueva lista de segmentos x1 = old[i][0] # Extrae la coordenada x del punto inicial x2 = old[i+1][0] # Extrae la coordenada x del punto final y1 = old[i][1] # Extrae la coordenada y del punto inicial y2 = old[i+1][1] # Extrae la coordenada y del punto final dx = x2 - x1 # Calcula componente en x dy = y2 - y1 # Calcula componente en y ax = dx / 2 # Calcula punto medio de la componente x ay = dy / 2 # Calcula punto medio de la componente y x = 0 # Coordenada x y = 0 # Coordenada y if(y1 == y2): # Si es un segmento horizontal x = x1 + ax if(tok * (x2 - x1) < 0): # Define direccion del segmento y = y1 - abs(ax) else: y = y1 + abs(ax) elif(x1 == x2): # Si es un segement vertical y = y1 + ay if(tok * (y2 -y1) > 0): # Define direccion del segmento x = x1 - abs(ay) else: x = x1 + abs(ay) else: # En caso de ser un segmento diagonal m = (y2 - y1) / (x2 - x1) # Calcula la pendiente de la linea if(tok > 0): # Define la direccion del segmento if(m > 0): # Segun la pendiente x = x1 + (ax - ay) y = y1 + (ax + ay) else: x = x1 + (ax - ay) y = y1 - (ax + ay) else: x = x1 + (ax + ay) y = y1 - (ax - ay) new.append((x, y)) # Agrega el nuevo punto a la lista de segmentos tok *= -1 # Alterna el token de direccion i += 1 # Incrementa el contador new.append(old[lim-1]) # Agrega el ultimo punto a la lista de segmentos return new # Devuelve la lista de segmentos # Colores a usar NEGRO = (0, 0, 0) BLANCO = (255, 255, 255) ROJO = (255, 0, 0) VERDE = (0, 255, 0) pygame.init() # Inicializa recursos pantalla = pygame.display.set_mode((800, 600), 0, 32) # Define atributos de la centana pygame.display.set_caption('Curva Del Dragón') # Titulo de la ventana lOld = [(200, 384.0), (700, 384.0)] # Lista con los puntos de arranque (linea horizontal) lNew = [] # Lista vacia para los futuros segmentos i = 0 # Contador de control while True: # Ciclo principal if(i < 20): # Limite de iteraciones pantalla.fill(NEGRO) # Limpia el area de la ventana lNew = genPoint(lOld) # Genera los nuevos segmentos de la iteración pygame.draw.lines(pantalla, ROJO, False, lOld) # Dibuja los segmentos anteriores con rojo pygame.draw.lines(pantalla, VERDE, False, lNew) # Dibuja los nuevos segmentos con verde lOld = lNew # Actualiza la lista de originales pygame.display.update() # Actualiza la imagen de la ventana time.sleep(0.5) # Demora de control i += 1 # Incrementa contador if(i == 20): # Si se han terminado las iteraciones pantalla.fill(BLANCO) # Limpia la ventana con blanco pygame.draw.lines(pantalla, NEGRO, False, lNew) # Dibuja el fractal con negro pygame.display.update() # Actualiza imagen for event in pygame.event.get(): # Ciclo de eventos, sale con escape if (event.type == QUIT) or (event.type == KEYDOWN and event.key == 27): pygame.quit() sys.exit()
Hasta la próxima.....Paz y Suerte...........黒オオカミ
Que interesante algoritmo, enhorabuena por este blog que se perfila como un espacio para el aprendizaje saludable de programación y algoritmia
ResponderEliminar