The Hitchhiker Pythonits’s Guide to the Galaxy

Esta vez haremos el descabellado intento de plotear una galaxia espiral morfológicamente mas o menos correcta, para esto haremos uso/abuso de Python seguido de sus secuaces Scipy y Mayavi. Utilizando hasta el cansancio funciones lambda, mapeos y filtros entre otros yuyos.

Para seguir adelante tenemos que refrescar que es un Automata Celular y para que servían las Coordenadas Polares .

El código se puede ver ACA al ser un poco mas extenso que los anteriores dejo el link a github.

Y se vería algo asi …

El pase de diapositivas requiere JavaScript.

Conjunto de Cantor con Python/Mayavi

Reutilizando el código anterior con mínimas modificaciones tenemos como resultado el Conjunto de Cantor (http://es.wikipedia.org/wiki/Conjunto_de_Cantor).

Solo colocaré la parte modifcada del código anterior, no se olviden de importar mayavi!


def generar(self, nivel, cursor, distancia):
    if nivel == 0:
       a = (cursor.x, cursor.x, cursor.x)
       b = (cursor.x + distancia*np.cos(cursor.ang),
            cursor.y + distancia*np.sin(cursor.ang))
       mlab.points3d(a, a, a, colormap="copper", scale_factor=.25)
       
       cursor.x = b[0]
       cursor.y = b[1]
    else:
       print "nivel = ", nivel
       for i in self.gramatica[self.inicial]:
           if i == 'A':
              self.generar(nivel-1, cursor, distancia/3.0)
           elif i == 'B':
              cursor.x += 3*distancia

if __name__ == "__main__":
     miSistema = SistemaL(gramatica = {'A':"ABA", 'B':"BBB"},
                          inicial = 'A',distancia = 1, nivel = 5)
     miSistema.iniciar()
     miSistema.generar(miSistema.nivel, miSistema.cursor, miSistema.distancia)
     print "termine con todos los niveles"
     mlab.show()

Y así quedaría …

El pase de diapositivas requiere JavaScript.

btw: puede haber quedado algo residual del anterior problema 🙂

Curva de Koch con Numpy y Pylab

Esta vez venimos con código para generar la famosa Curva de Koch 
http://es.wikipedia.org/wiki/Copo_de_nieve_de_Koch , este es solo la curva..no el copo ...
pero el sistema es el mismo. 
Como verán el código es genérico porq tiene toda la intención de usarse 
con otras gramáticas de Lin. .. pero para eso falta un poco de pulido.
Los puntos clave pasan por la recursión, el cursor y los niveles :).
Espero que les sea útil.
#! /usr/bin/python2
# -*- coding: utf-8 -*-

import numpy as np
import pylab as pl

class Cursor:
    def __init__(self,x,y, angulo):
        self.x = x
        self.y = y
        self.ang = angulo

class SistemaL:
     def __init__(self,gramatica, inicial, distancia, nivel):
        self.gramatica = gramatica
        self.inicial = inicial
        self.distancia = distancia
        self.nivel = nivel

     def iniciar(self):
        self.cursor = Cursor(0,0,0)
        pl.plot([self.cursor.x, self.cursor.x+ self.distancia],
                [self.cursor.y, self.cursor.y])

     def generar(self, nivel, cursor, distancia):
        if nivel == 0:
           a = (cursor.x, cursor.y)
           b = (cursor.x + distancia*np.cos(cursor.ang),
                cursor.y + distancia*np.sin(cursor.ang))
           print a, "-->", b
           pl.plot([a[0],b[0]],[a[1],b[1]])
           cursor.x = b[0]
           cursor.y = b[1]
        else:
           print "nivel = ", nivel
           for i in self.gramatica[self.inicial]:
               if i == 'F':
                    self.generar(nivel-1, cursor, distancia/3)
               elif i == '+':
                    cursor.ang = cursor.ang - np.pi/3
               elif i == '-':
                    cursor.ang = cursor.ang + np.pi/3

if __name__ == "__main__":
     miSistema = SistemaL(gramatica = {'F':"F-F++F-F"},inicial = 'F',
                          distancia = 10000, nivel = 5)
     miSistema.iniciar()
     miSistema.generar(miSistema.nivel, miSistema.cursor,
                       miSistema.distancia)
     print "termine con todos los niveles"
     pl.show()

Yyyy unas imágenes de como sería nuestro resultado ...

El pase de diapositivas requiere JavaScript.