Se diseñó y codificó la clase central PerlinNoiseGenerator en Python, encapsulando toda la lógica de cálculo y el estado de la grilla. Esto facilita la generación de campos de ruido coherentes y repetibles.
Detalle Técnico
Inicialización de Gradientes: Desarrollo de una rutina para llenar la grilla con vectores unitarios aleatorios. Estos vectores determinan las "pendientes" iniciales del ruido.
Función de Suavizado ($f(t) = 6t^5 - 15t^4 + 10t^3$): Implementación precisa de la función polinomial de quinto orden de Ken Perlin para asegurar la continuidad de clase $C^2$ del ruido, eliminando artefactos visibles.
Arquitectura Modular: Separación de lógica principal y funciones auxiliares (dot_product, lerp, fade) para mantener el código limpio y testeable.
II. Análisis y Comparación Algorítmica
Un objetivo clave del proyecto fue la validación y comprensión del algoritmo mediante la creación de variantes comparativas. Esto demuestra la importancia de los pasos de **suavizado** e **interpolación** en la calidad del resultado.
Perlin Clásico vs. Lineal
Comparación del algoritmo estándar con una variante (perlin_linear) que omite la función de suavizado (fade). El resultado demuestra la aparición de artefactos o "costuras" al usar solo la interpolación lineal sin curvar.
Contribución Aislada
Implementación del método perlin_contribucion_sw para aislar y visualizar la influencia del producto punto de una sola esquina (Suroeste). Esto clarifica cómo las cuatro contribuciones se suman mediante la interpolación para formar el ruido final.
III. Visualizaciones Dinámicas y Estáticas
Se desarrolló un módulo de visualización para transformar los datos de NumPy en representaciones gráficas didácticas usando Matplotlib y su extensión de animación.
Características Destacadas
Mapas de Calor Estáticos: Gráficos de alta resolución para cada variante del ruido, ideal para la documentación y la comparación inmediata de resultados.
Representación de Gradientes: Función para dibujar los vectores de gradiente sobre la grilla, clave para entender la entrada del producto punto.
Animación Paso a Paso (Barrido): Usando FuncAnimation, se creó una animación que barre la pantalla, calculando y dibujando el ruido celda por celda. Este es el punto didáctico más fuerte, pues visualiza el proceso de **interpolación en tiempo real**.
IV. 🏔️ Explorando el Caos Controlado: Teoría del Ruido Perlin 2D
El Ruido Perlin, desarrollado por Ken Perlin, es una función de generación procedural que simula texturas orgánicas como el humo, el agua o el terreno. A diferencia del ruido aleatorio puro, que produce un resultado caótico, el Ruido Perlin genera un patrón de **"caos controlado"** que es continuo y coherente en el espacio.
1. La Grilla de Gradientes: El Esqueleto del Ruido
El proceso comienza dividiendo el espacio 2D en una cuadrícula regular de puntos (nodos). En lugar de asignar un valor aleatorio a cada nodo (como haría el ruido de valor), el Ruido Perlin asigna un **vector de gradiente** aleatorio a cada nodo de la grilla.
¿Qué es un Gradiente? Es un vector unitario que apunta en una dirección aleatoria. Estos vectores actúan como "directores" de la pendiente del ruido en sus inmediaciones.
2. La Contribución del Producto Punto
Para calcular el valor de ruido en cualquier punto dentro de una celda de la cuadrícula, el algoritmo realiza el siguiente paso por cada una de las cuatro esquinas de la celda:
Vector Distancia: Se calcula el vector que va desde el nodo de la esquina hasta el punto donde queremos calcular el ruido.
Producto Punto: Se calcula el producto punto entre el **vector de gradiente** del nodo y el **vector distancia** recién calculado.
El producto punto es la clave: indica **cuánto contribuye** el gradiente de esa esquina al valor del ruido en ese punto. Si el vector distancia está alineado con el gradiente, la contribución será alta; si es perpendicular, será cercana a cero.
3. La Doble Interpolación: Creando la Continuidad
Una vez que tenemos cuatro valores de contribución, necesitamos combinarlos de manera suave para obtener el valor final del ruido en ese punto:
Interpolación Lineal (LERP): Los valores se interpolan horizontalmente y luego verticalmente, garantizando la continuidad del ruido.
La Función de Suavizado ($f(t)$): Se aplica la función polinomial de quinto orden ($f(t) = 6t^5 - 15t^4 + 10t^3$) a las coordenadas antes de la interpolación. Esto es crucial para asegurar la continuidad $C^2$ (suavidad de la curva) y eliminar artefactos "cuadrados" en los bordes de la cuadrícula.
El resultado es un generador eficiente y una herramienta didáctica que desmitifica cómo las matemáticas simples pueden crear la base para la generación procedural en los gráficos por computadora.