Las llamas fractales son un miembro de la clase de sistema de funciones iteradas [1] de fractales creados por Scott Draves en 1992. [2] El código de fuente abierta de Draves fue posteriormente trasladado al software de gráficos Adobe After Effects [3] y traducido al editor de llamas fractales Apophysis . [2]
Las llamas fractales se diferencian de los sistemas de funciones iteradas ordinarios en tres aspectos:
El mapeo de tonos y la coloración están diseñados para mostrar la mayor cantidad posible de detalles del fractal, lo que generalmente da como resultado una imagen estéticamente más agradable.
El algoritmo consta de dos pasos: crear un histograma y luego renderizarlo.
Primero, se itera un conjunto de funciones, comenzando desde un punto elegido aleatoriamente P = (Px,Py,Pc) , donde la tercera coordenada indica el color actual del punto.
En cada iteración, se elige una de las funciones anteriores donde la probabilidad de que se elija F j es p j . Luego, se calcula la siguiente iteración de P aplicando F j en (Px,Py) .
Cada función individual tiene la siguiente forma:
donde el parámetro w k se llama peso de la variación V k . Draves sugiere [4] que todos los : son no negativos y suman uno, pero las implementaciones como Apophysis no imponen esa restricción.
Las funciones V k son un conjunto de funciones predefinidas. Algunos ejemplos [4] son
El color Pc del punto se mezcla con el color asociado con la última función aplicada F j :
Después de cada iteración, se actualiza el histograma en el punto correspondiente a (Px,Py) . Esto se hace de la siguiente manera:
histograma [ x ][ y ][ FRECUENCIA ] := histograma [ x ][ y ][ FRECUENCIA ] + 1 histograma [ x ][ y ][ COLOR ] := ( histograma [ x ][ y ][ COLOR ] + P . c ) / 2
Por lo tanto, los colores de la imagen reflejarán qué funciones se utilizaron para llegar a esa parte de la imagen.
Para aumentar la calidad de la imagen, se puede utilizar el supermuestreo para reducir el ruido. Esto implica crear un histograma más grande que la imagen, de modo que cada píxel tenga varios puntos de datos de los que extraer datos. Por ejemplo, cree un histograma con 300×300 celdas para dibujar una imagen de 100×100 px; cada píxel utilizaría un grupo de 3×3 de cubos de histograma para calcular su valor.
Para cada píxel (x,y) de la imagen final, realice los siguientes cálculos:
frecuencia_promedio [ x ][ y ] := promedio_de_frecuencia_de_celdas_del_histograma ( x , y ); color_promedio [ x ][ y ] := promedio_de_color_de_celdas_del_histograma ( x , y ); alpha [ x ][ y ] := log ( frequency_avg [ x ][ y ]) / log ( frequency_max ); //frequency_max es el número máximo de iteraciones que llegan a una celda en el histograma. final_pixel_color [ x ][ y ] := color_avg [ x ][ y ] * alpha [ x ][ y ] ^ ( 1 / gamma ); //gamma es un valor mayor que 1.
El algoritmo anterior utiliza corrección de gamma para que los colores parezcan más brillantes. Esto se implementa, por ejemplo, en el software Apophysis.
Para aumentar aún más la calidad, se puede utilizar la corrección gamma en cada canal de color individual, pero este es un cálculo muy pesado, ya que la función logarítmica es lenta.
Un algoritmo simplificado sería dejar que el brillo dependa linealmente de la frecuencia:
color_píxel_final [ x ][ y ] := color_promedio [ x ][ y ] * frecuencia_promedio [ x ][ y ] / frecuencia_máx ;
Pero esto haría que algunas partes del fractal perdieran detalle, lo cual es indeseable. [4]
El algoritmo de la llama es como una simulación de Monte Carlo , en la que la calidad de la llama es directamente proporcional al número de iteraciones de la simulación. El ruido que resulta de este muestreo estocástico se puede reducir desenfocando la imagen para obtener un resultado más uniforme en menos tiempo. Sin embargo, no se desea perder resolución en las partes de la imagen que reciben muchas muestras y, por lo tanto, tienen poco ruido.
Este problema se puede resolver con una estimación de densidad adaptativa para aumentar la calidad de la imagen y mantener los tiempos de renderizado al mínimo. FLAM3 utiliza una simplificación de los métodos presentados en *Adaptive Filtering for Progressive Monte Carlo Image Rendering*, un artículo presentado en WSCG 2000 por Frank Suykens e Yves D. Willems. La idea es variar el ancho del filtro de manera inversamente proporcional al número de muestras disponibles.
Como resultado, las áreas con pocas muestras y mucho ruido se vuelven borrosas y suavizadas, pero las áreas con muchas muestras y poco ruido no se ven afectadas. [5]
No todas las implementaciones de Flame utilizan estimación de densidad.