Ideas en bits

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"

video tik tok

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:

  1. Colocar 3 puntos en un plano.
  2. Elegir uno de los puntos y dibujar otro a la mitad de camino con cualesquiera de los otros 2 restantes.
  3. 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:

primer triangulo

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!

primer punto

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

alt

100 puntos

alt

1000 puntos

alt

Y como para demostrar la teoria, con 7000 puntos ya vemos una forma mas concreta:

alt


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.

Links


about 2 years ago

Ariel Parra