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.

Anuncios

2 pensamientos en “Curva de Koch con Numpy y Pylab

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s