# El codigo a continuacion no es original sino es una adaptacion y estudio del algoritmo mejorado del ruido de Perlin
# Me enfoco en usar el algoritmo con solo la libreria de matematica/aleatoridad de numpy.
def generar_tabla_de_permutacion(size=256):
tabla = np.arange(size, dtype=int)
np.random.shuffle(tabla)
return np.concatenate([tabla, tabla])
# Genero una tabla de una permutacion de una lista de indices entre 0 y 255 inclusive,
# la funcion de esta es dar valores para las gradiantes de los vertices de las celdas de las cuadriculas
tabla_de_permutacion = generar_tabla_de_permutacion()
def lerp(a, b, x):
return a + x * (b - a)
# Lerp es una funcion de interpolacion linear que intenta suavizar los valores,
# creando una transicion ms suave
def fade(t):
return t * t * t * (t * (t * 6 - 15) + 10)
# fade es una funciΓ³n que suaviza la transicion entre los valores x e y con una inteprolacion cubica
# Complementa la interpolacion lineal o lerp, para que el resultado no se vea
# brusco o "cubico"
def grad_original(hash, x, y):
h = hash & 3
u = x if h < 2 else y
v = y if h < 2 else x
return (u if h & 1 == 0 else -u) + (v if h & 2 == 0 else -v)
#
# Esta grad similar a las funciones de lerp y fade son las funciones originales que Ken Perlin utilizo
# en el algoritmo original, aunque aun mas complicado, utiliza comparaciones y operaciones binarias
# para conseguir el producto escalar de una manera mas eficiente, sin utilizar multiplicacion.
def grad_simplificada(hash, x, y):
h = hash & 3
if h == 0:
grad_vector = (1.0, 1.0) # arriba a la derecha
elif h == 1:
grad_vector = (-1.0, 1.0) # arriba a la izquierda
elif h == 2:
grad_vector = (-1.0, -1.0) # abajo a la izquierda
else:
grad_vector = (1.0, -1.0) # abajo a la derecha
# Y calculamos el producto escalar
producto_escalar = grad_vector[0] * x + grad_vector[1] * y
return producto_escalar
def perlin(x, y):
xi = int(x) & 255
yi = int(y) & 255
# Determinamos las posiciones x e y como xi e yi como valores enteros en la matriz,
# el & 255 (maximo numero en 8 bits), asegura que los numeros esten dentro del rango 0-255
xf = x - int(x)
yf = y - int(y)
# Posiciones de x e y relativas a su posicion dentro de su celda en la cuadricula.
# El resultado final es un valor entre 0 y 0.99...
u = fade(xf)
v = fade(yf)
#
aa = tabla_de_permutacion[tabla_de_permutacion[xi] + yi] # Abajo a la izquierda
ab = tabla_de_permutacion[tabla_de_permutacion[xi] + yi + 1] # Abajo a la derecha
ba = tabla_de_permutacion[tabla_de_permutacion[xi + 1] + yi] # Arriba a la izquierda
bb = tabla_de_permutacion[tabla_de_permutacion[xi + 1] + yi + 1] # Arriba a la derecha
# Obtenemos de la tabla de permutacion los valores, se hace un acceso doble (se repite permutation_table)
# para aumentar el nivel de "entropia" o "caos" y que sea aun mas aleatorio posible
x1 = lerp(grad_simplificada(aa, xf, yf), grad_simplificada(ba, xf - 1, yf), u)
x2 = lerp(grad_simplificada(ab, xf, yf - 1), grad_simplificada(bb, xf - 1, yf - 1), u)
return lerp(x1, x2, v)
def generar_ruido_de_perlin(ancho, largo, escala):
ruido = np.zeros((ancho, largo))
for i in range(ancho):
for j in range(largo):
ruido[i][j] = perlin(i / escala, j / escala)
return ruido
# Crear la matriz de ruido Perlin
ancho, largo, escala = 50, 50, 10
ruido = generar_ruido_de_perlin(ancho, largo, escala)
# Mapear valores de ruido a emojis
def noise_to_emoji(noise_value):
if noise_value < -0.1:
return 'π'
elif noise_value < 0.1:
return 'ποΈ'
elif noise_value < 0.5:
return 'π³'
else:
return 'β°οΈ'
mapa_de_emojis = []
for i in range(ancho):
emoji = ""
for j in range(largo):
emoji += noise_to_emoji(ruido[i][j])
mapa_de_emojis.append(emoji)
# Imprimir la obra de emojis
for emoji in mapa_de_emojis:
print(emoji)
# https://docs.google.com/presentation/d/1VhjQvxGNvaNiTwyvcd8l2RZDykwxZKnnIKjMfUWbVng/edit?usp=sharing
#
# # 'Un resultado'
# ποΈπ³π³π³π³β°οΈπ³π³π³π³ποΈποΈππποΈποΈποΈπ³π³ποΈποΈποΈππποΈποΈποΈπ³π³ποΈποΈποΈππποΈποΈποΈπ³π³ποΈποΈπππππππππ
# πποΈπ³π³π³π³π³π³π³ποΈππππππποΈποΈποΈποΈπππππποΈπ³π³π³π³ποΈποΈποΈποΈποΈποΈποΈποΈποΈποΈποΈπππππππππ
# ππποΈπ³π³π³π³π³ποΈππππππππππππππππποΈποΈπ³π³π³π³ποΈποΈποΈποΈποΈποΈποΈποΈποΈππππππππππ
# πππποΈποΈπ³ποΈποΈππππππππππππππππππποΈπ³π³π³π³ποΈποΈποΈποΈποΈποΈποΈποΈποΈππππππππππ
# πππποΈποΈποΈποΈποΈππππππππππππππππππποΈποΈπ³π³ποΈποΈποΈποΈπ³π³π³π³ποΈποΈποΈπππππππππ
# ππππποΈποΈποΈππππππππππππππππππππποΈποΈποΈποΈποΈποΈπ³π³π³π³π³π³ποΈποΈποΈππππππποΈποΈ
# πππποΈποΈποΈποΈποΈππππππππππππππππππππππποΈποΈποΈπ³π³π³π³π³π³π³ποΈποΈποΈππποΈποΈποΈπ³π³
# πππποΈποΈπ³ποΈποΈπππππππππππππππππππππππποΈποΈπ³π³π³π³π³π³π³π³ποΈποΈποΈποΈποΈπ³π³π³π³
# ππποΈπ³π³π³π³π³ποΈππππππππππππππποΈπππππππποΈποΈπ³π³π³π³π³π³π³π³ποΈποΈποΈποΈπ³π³π³π³π³
# πποΈπ³π³π³π³π³π³π³ποΈπππππππππππποΈποΈποΈποΈποΈππππποΈποΈπ³π³π³π³π³π³π³π³ποΈποΈποΈποΈποΈποΈπ³π³π³π³
# ποΈπ³π³π³π³β°οΈπ³π³π³π³ποΈπππππππππποΈποΈπ³π³ποΈποΈποΈππποΈποΈπ³π³π³π³β°οΈπ³π³π³π³ποΈποΈππποΈποΈποΈπ³π³ποΈ
# π³π³π³π³β°οΈβ°οΈβ°οΈπ³π³π³π³ποΈπππππππποΈπ³π³π³π³π³π³ποΈποΈποΈποΈπ³π³π³π³π³π³π³π³π³ποΈππππππποΈποΈποΈποΈ
# π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³ποΈπππππποΈπ³π³π³π³π³π³π³π³π³π³π³π³π³π³π³β°οΈπ³π³π³ποΈππππππππποΈποΈποΈ
# π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³ποΈποΈποΈποΈποΈπ³π³π³π³β°οΈβ°οΈβ°οΈπ³π³π³π³π³π³π³π³β°οΈβ°οΈπ³π³ποΈππππππππππποΈποΈ
# π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³π³π³π³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³π³β°οΈβ°οΈπ³π³π³ποΈππππππππππποΈποΈ
# β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³π³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³π³ποΈποΈππππππππππποΈποΈ
# π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³π³π³π³π³π³π³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³π³π³ποΈπππππππππππποΈποΈ
# π³π³β°οΈβ°οΈβ°οΈπ³π³π³π³π³π³π³π³π³π³π³π³π³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³π³π³ποΈποΈποΈππππππππππποΈποΈ
# π³π³π³π³π³π³π³π³π³π³π³π³π³π³π³π³π³ποΈποΈπ³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³ποΈποΈποΈποΈποΈποΈποΈπππππππππποΈποΈ
# π³π³π³π³π³π³ποΈποΈποΈποΈπ³π³π³π³π³π³ποΈποΈποΈποΈπ³π³π³π³β°οΈβ°οΈβ°οΈπ³π³π³π³ποΈποΈποΈποΈποΈποΈποΈποΈποΈπππππππππποΈ
# ποΈποΈπ³π³ποΈποΈποΈππποΈποΈποΈπ³π³ποΈποΈποΈππποΈποΈπ³π³π³π³β°οΈπ³π³π³π³ποΈποΈππποΈποΈποΈπ³π³ποΈποΈπππππππππ
# πποΈποΈποΈποΈππππππποΈποΈποΈποΈππππππποΈπ³π³π³π³π³π³π³ποΈποΈππππποΈπ³π³π³π³ποΈποΈππππππππ
# ππποΈποΈππππππππποΈποΈππππππππποΈπ³π³π³π³π³ποΈποΈπππππποΈπ³π³π³π³π³ποΈππππππππ
# πππππππππππππππππππππππποΈποΈποΈπ³ποΈποΈποΈππππποΈποΈπ³π³π³π³π³ποΈππππππππ
# πππππππππππππππππππππππππποΈποΈποΈποΈποΈποΈπποΈποΈποΈπ³π³π³π³π³ποΈποΈππππππππ
# πππππππππππππππππππππππππππποΈποΈποΈποΈποΈποΈπ³π³π³π³π³π³ποΈποΈπππππππππ
# ππππππππππππππππππππππππππππποΈποΈποΈπ³π³π³π³π³π³π³π³ποΈποΈπππππππππ
# πππππππππππππποΈποΈποΈποΈποΈππππππππππποΈποΈπ³π³π³π³π³π³π³π³ποΈποΈππππππππππ
# ππποΈποΈππππππππποΈπ³π³π³π³π³ποΈπππππππππποΈποΈπ³π³π³π³π³π³π³π³π³ποΈππππππππππ
# πποΈποΈποΈποΈππππππποΈπ³π³π³π³π³π³π³ποΈπππππππππποΈποΈπ³π³π³π³π³π³π³π³ποΈποΈπππππποΈποΈποΈποΈ
# ποΈποΈπ³π³ποΈποΈποΈππποΈποΈπ³π³π³π³β°οΈπ³π³π³π³ποΈπππππππππποΈπ³π³π³π³β°οΈπ³π³π³π³ποΈποΈππποΈποΈποΈπ³π³ποΈ
# π³π³π³π³π³π³ποΈποΈποΈποΈπ³π³π³π³β°οΈβ°οΈβ°οΈπ³π³π³π³ποΈπππππππππποΈπ³π³π³π³π³π³π³π³ποΈποΈποΈποΈποΈποΈπ³π³π³π³
# π³π³π³π³π³π³π³π³π³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³ποΈπππππππππποΈπ³π³π³π³π³π³π³π³ποΈποΈποΈποΈπ³π³π³π³π³
# π³π³π³π³π³π³π³π³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³ποΈπππππππππποΈπ³π³π³π³π³π³π³ποΈποΈποΈποΈπ³π³π³π³π³
# π³π³β°οΈβ°οΈπ³π³π³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³πππππππππποΈπ³π³π³π³π³π³ποΈποΈποΈποΈποΈποΈπ³π³π³π³
# β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³ποΈππππππππποΈπ³π³π³π³π³π³ποΈποΈππποΈποΈποΈπ³π³ποΈ
# π³π³π³π³π³π³π³β°οΈβ°οΈπ³π³π³π³π³π³π³π³π³π³π³π³π³π³π³ποΈππππππππποΈπ³π³π³π³π³ποΈποΈππππποΈποΈποΈποΈποΈ
# π³π³π³π³π³π³π³π³π³π³π³π³π³π³ποΈποΈποΈπ³π³π³π³π³π³π³π³ποΈπππππππποΈπ³π³π³π³ποΈποΈππππππποΈποΈποΈποΈ
# π³π³π³π³π³π³π³π³π³π³π³π³ποΈποΈπππποΈποΈπ³π³π³π³π³π³ποΈππππππποΈπ³π³π³π³π³ποΈποΈππππππποΈποΈποΈποΈ
# π³ποΈποΈποΈποΈπ³π³π³π³π³π³ποΈπππππππποΈπ³π³π³π³π³ποΈπππππποΈπ³π³π³π³π³π³π³ποΈποΈππππποΈποΈποΈποΈποΈ
# ποΈποΈππποΈποΈποΈπ³π³ποΈποΈπππππππππποΈποΈπ³π³ποΈποΈποΈππποΈποΈπ³π³π³π³β°οΈπ³π³π³π³ποΈποΈππποΈποΈποΈπ³π³ποΈ
# ππππππποΈποΈποΈποΈπππππππππππποΈποΈποΈποΈποΈποΈποΈποΈποΈποΈπ³π³π³β°οΈβ°οΈβ°οΈπ³π³π³π³ποΈποΈποΈποΈπ³π³π³π³π³
# ππππππππππππππππππππππποΈποΈποΈποΈποΈποΈποΈποΈπ³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³π³π³π³π³π³π³π³π³
# ππππππππππππππππππππππππππποΈποΈποΈποΈπ³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³π³π³π³π³π³β°οΈβ°οΈβ°οΈπ³
# πππππππππππππππππππππππππππποΈποΈποΈποΈπ³π³π³π³π³β°οΈβ°οΈβ°οΈπ³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈ
# πππππππππππππππππππππππππππποΈποΈποΈποΈποΈποΈποΈπ³π³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈ
# πππππππππππππππππππππππππππποΈποΈποΈποΈπππποΈποΈπ³π³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈ
# ππππππππππππππποΈποΈποΈππππππππππποΈποΈποΈπππππππποΈπ³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³
# ππππππππππππποΈποΈπ³π³π³ποΈποΈπππππππποΈποΈποΈποΈππππππππποΈπ³π³π³π³β°οΈβ°οΈβ°οΈβ°οΈβ°οΈπ³π³
# πππππππππππποΈπ³π³π³π³π³π³π³ποΈπππππποΈποΈποΈποΈποΈποΈππππππππποΈπ³π³π³π³β°οΈβ°οΈβ°οΈπ³π³π³```