Tik Tok y la imaginación
Uso mucho las redes sociales en general, y Tik Tok especialmente para distraer mi mente de forma total. Sin embargo cada tanto aparecen videos que me dejan "sorpresa" y este fue el caso de uno de esos: "The Chaos Game"
The Chaos Game
Básicamente se trata del Triángulo de Sierpinski (te largo "basicamente" asi sin que se me caiga la cara hee), que nos dice lo siguiente
El triángulo de Sierpiński es un fractal que se puede construir a partir de cualquier triángulo.
El "paso a paso" que vemos en el video sigue estos puntos:
- Colocar 3 puntos en un plano.
- Elegir uno de los puntos y dibujar otro a la mitad de camino con cualesquiera de los otros 2 restantes.
- Repetir esta operacion a partir del nuevo punto creado.
Repitiendo el paso 3 explica como la figura va apareciendo mientras más puntos agregamos, y la verdad que apenas lo vi me dieron ganas de probarlo.
Python Amigo
Tomando al viejo y conocido Python, y con la ayuda de la libreria matplotlib me puse a armar algo para probar esto.
Como vamos a trabajar con puntos, se va a hacer más facil la tarea si tenemos una estructura de datos para el objeto, cosa sencilla con dataclasses
:
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
Ok, ahora primera prueba ya que nunca habia usado matplotlib
dibuje 3 puntos con la funcion scatter
y seteando un color negro con el parametro c
import matplotlib.pyplot as plt
point_one = Point(1, 1)
point_two = Point(22, 1)
point_three = Point(11, 22)
plt.scatter(point_one.x, point_one.y, c='#000')
plt.scatter(point_two.x, point_two.y, c='#000')
plt.scatter(point_three.x, point_three.y, c='#000')
Genial, ya tenemos nuestro primer triángulo:
Segundo challenge, en cada iteración vamos a necesitar calcular el punto medio entre 2 puntos, asi que armamos una función util "sencillita":
def create_middle_point(point_a, point_b):
new_x = (point_a.x + point_b.x) / 2.0
new_y = (point_a.y + point_b.y) / 2.0
return Point(new_x, new_y)
Ahora "manos a la obra"; necesitamos un punto para empezar, asi que aprovechamos la función anterior y elegimos el punto medio entre 2 de los puntos base:
starting_point = create_middle_point(point_one, point_two)
Siguiente paso, hay que dibujar un punto a la mitad entre el que acabamos de crear y uno de los puntos del triángulo (estos deberian ser los pivotes en cada iteración) elegidos al azar, de cajon los metemos en una lista y usamos random.choice
cada vez:
import random
# puntos iniciales
initial_points = [point_one, point_two, point_three]
# eleccion random de un punto
random_pivot_point = random.choice(initial_points)
new_point = create_middle_point(starting_point, random_pivot_point)
# dibujar el nuevo punto
plt.scatter(new_point.x, new_point.y, s=1)
Ahi lo tenemos al pequeño!
Detalle en el anterior punto, utilice el parámetro s
para definir el tamaño del punto (valor 1
), de esa manera los internos serán mas chicos.
Y lo que sigue, es simplemente repetir:
for _ in range(10):
random_pivot_point = random.choice(initial_points)
new_point = create_middle_point(starting_point, random_pivot_point)
plt.scatter(new_point.x, new_point.y, s=1)
starting_point = new_point
10 puntos
100 puntos
1000 puntos
Y como para demostrar la teoria, con 7000 puntos ya vemos una forma mas concreta:
Conclusión
Una vez más, que buen amigo que es Python y que fácil de usar.
Creo que la mejor manera de aprender librerías, frameworks, lenguajes nuevos es tener un desafío, y no hace falta que sea un super proyecto, con solo tener una chispa de inquietud por terminar algo vamos a poder encontrar esas ganas y proactividad para hacerlo.