(es) Planeta fractal
(eo) Fraktalplanedo
http://dx.doi.org/10.13140/RG.2.2.34092.90243
Descripción artística:
Un mundo fractal.
Motivación:
Una revisión de las diferentes variantes conocidas de fractales de la familia Mándelbrot.
Descripción técnica:
Una vista de alta resolución de un conjunto fractal similar al de Mándelbrot, pero con ecuación recursiva .
El conjunto de Mándelbrot es el conjunto de todos los puntos del plano complejo tal que la sucesión (con ) no diverge (es decir, tal que es acotada).
El criterio usado para determinar si las sucesiones divergen o no, es si , con , tiene un módulo mayor que 2, es decir (procedimiento estándar para los conjuntos de Julia y de Mándelbrot). Puesto que no puede evaluarse hasta el infinito, se usa una cota: . Si la sucesión no “diverge” antes de llegar al -ésimo término de las sucesiones, se considera que no diverge, es decir que es acotada.
Archivos
Código (Python):
#!/usr/bin/env python # coding: utf-8 # Copyright 2015 Eduardo Adam Navas López # Este programa es Software Libre liberado bajo la licencia GNU GPLv3 o su versión más reciente: # http://www.gnu.org/licenses/gpl.html """Este programa genera una imagen en pantalla o en archivo, según el valor de la variable global 'prueba'. La imagen generada es una variante del conjunto de Mandelbrot """ import cmath import pygame #import escala import datetime prueba = True #prueba = False #Hay que descomentar esta línea para una versión 'final' if prueba: TAM = 200 else: TAM = 8000 ANCHO = TAM ALTO = TAM MAXPASOS = 40 LIMITEMODULO = 2.0 LIMITEMODULO2 = 4.0 SUPERIOR_DER = (0.93, 0.93) INFERIOR_IZQ = (-0.93,-0.93) COLOR_ADENTRO = (255,255,255) COLOR_AFUERA = (0,0,0) COLOR_AFUERA2 = (128,128,128) ROJO = (255,0,0) VERDE = (0,255,0) AZUL = (0,0,255) BLANCO = (255,255,255) NEGRO = (0,0,0) def mundo(z,c): "mundo" return cmath.exp((z**2-1.00001*z)/c**3) def dibujar(lienzo): #Dibujar imagen: pantalla.fill(BLANCO) if prueba: porcentajes = [(x+1)/100.0 for x in range(99)] else: porcentajes = [(x+1)/500.0 for x in range(500)] porcentajes.reverse() print "Iniciando cálculo de puntos" print "0%" for y in xrange(ALTO): c_i = (INFERIOR_IZQ[1]-SUPERIOR_DER[1])*float(y)/ALTO + SUPERIOR_DER[1] for x in xrange(ANCHO): c_r = (SUPERIOR_DER[0]-INFERIOR_IZQ[0])*float(x)/ANCHO + INFERIOR_IZQ[0] c = c_r + c_i*1j z = 0+0j numPasos = 0 while numPasos<MAXPASOS and (z.real*z.real+z.imag*z.imag)<LIMITEMODULO2: try: z= mundo(z,c) except OverflowError: break except ZeroDivisionError: break numPasos += 1 if numPasos==MAXPASOS: #Sí converge lienzo.set_at((x,y),COLOR_ADENTRO) else: col = int(255*float(numPasos)/MAXPASOS) color = [col,col,col] color[numPasos%3]=255 lienzo.set_at((x,y),tuple(color)) #Para cantidades grandes de TAM... if len(porcentajes)>0 and float(y)/TAM>porcentajes[-1]: print "{:2}%".format(porcentajes.pop()*100) print "100%" #Actualizar o guardar: if prueba: pygame.display.flip() else: fin = datetime.datetime.today() nombrearchivo = "mundo-{:02}{:02}{:02}{:02}{:02}{:02}.png".format(fin.year, fin.month, fin.day, fin.hour, fin.minute, fin.second) pygame.image.save(pantalla, nombrearchivo) if __name__ == "__main__": pygame.init() if prueba: pantalla = pygame.display.set_mode((ANCHO, ALTO)) pygame.display.set_caption("Mundo") else: pantalla = pygame.Surface((ANCHO, ALTO)) #e = escala.Escala((ANCHO, ALTO), INF_IZQ, SUP_DER) dibujar(pantalla) corriendo = True if prueba: while corriendo: for evento in pygame.event.get(): if evento.type == pygame.QUIT: corriendo = False
No hay comentarios:
Publicar un comentario