2009-09-29 17 views
15

Estoy tratando de implementar buddhabrot fractal. No puedo entender una cosa: todas las implementaciones que inspeccione eligen puntos al azar en la imagen para calcular la ruta de escape de la partícula. ¿Por qué hacen esto? ¿Por qué no revisas todos los píxeles?Buddhabrot Fractal

¿Para qué sirven los puntos aleatorios? Más puntos hacen mejores fotos, así que creo que revisar todos los píxeles es la mejor imagen. ¿Me equivoco aquí?

Desde mi datos de prueba:

Trabajando en 400x400 imagen. Así que 160 000 píxeles para iterar si voy por todas partes.

Uso de muestreo aleatorio, La imagen solo comienza a tomar forma después de 1 millón de puntos. Los buenos resultados muestran alrededor de mil millones de puntos aleatorios que tardan horas en computarse.

+0

En cuanto a su edición, ¿se trata de datos de prueba de muestreo aleatorio o de un método de fuerza bruta para revisar todos los píxeles? Si bien espero que el muestreo aleatorio sea más rápido (en promedio), me gustaría saber cómo se comparan los dos métodos * en realidad * en la práctica. – Streklin

+1

mi error olvidó mencionarlo. Esta información es de muestreo aleatorio. –

+1

Hmm, los números parecen un poco raros entonces, ¿cómo estás haciendo tu muestreo al azar? Creo que después de mil millones de puntos, habrás capturado cada punto de interés al menos unas pocas veces (aunque no hay garantía de eso) de un conjunto de muestra de 160, 000. ¿Obtiene la misma calidad de imagen cuando revisa cada píxel una vez por fuerza bruta? – Streklin

Respuesta

31

El muestreo aleatorio es mejor que el muestreo en cuadrícula por dos razones principales. En primer lugar, porque el muestreo en cuadrícula introducirá artefactos en forma de cuadrícula en la imagen resultante. En segundo lugar, porque el muestreo en cuadrícula puede no proporcionarle suficientes muestras para una imagen resultante convergente. Si después de completar un pase de cuadrícula, quería más muestras, tendría que hacer otro pase con una cuadrícula ligeramente desplazada (para no volver a muestrear los mismos puntos) o cambiar a una cuadrícula más fina que podría terminar haciendo más trabajo del necesario . El muestreo aleatorio proporciona resultados muy suaves y puede detener el proceso tan pronto como la imagen converja o esté satisfecho con los resultados.

Soy el inventor de la técnica así que puedes confiar en mí en esto. :-)

1

Si bien no soy 100% consciente de cuál es el motivo exacto, supongo que tiene más que ver con la eficiencia. Si va a iterar a través de cada punto varias veces, va a perder muchos ciclos de procesamiento para obtener una imagen que puede no se ve mucho mejor. Al hacer un muestreo aleatorio, puede reducir la cantidad de trabajo que se necesita hacer y, dado un tamaño de muestra lo suficientemente grande, se obtiene un resultado que es difícil de "diferenciar" de iterar sobre todos los píxeles (desde un punto de vista visual).

0

Esto es posiblemente un tipo de Monte-Carlo method así que sí, pasar por todos los píxeles produciría el resultado perfecto, pero sería terriblemente lento.

¿Por qué no lo pruebas y ves qué pasa?

+5

Creo que usted y otros están un poco obsesionados con la suposición tácita de que solo hay un número finito de puntos de partida. Los píxeles no son puntos; son regiones cuadradas. Comenzar con diferentes puntos dentro de un píxel dado puede generar trayectorias drásticamente diferentes. –

3

Lo mismo vale para los fractales de llamas: Buddha Brot se trata de encontrar los "atractores", así que incluso si comienzas con un punto aleatorio, se supone que converge muy rápidamente a estas curvas atrayentes. Por lo general, evitas pintar los primeros 10 píxeles en la iteración o así, de todos modos, por lo que el punto de partida no es realmente relevante, PERO, para evitar hacer el mismo cálculo dos veces, el muestreo aleatorio es mucho mejor. Como se mencionó, elimina el riesgo de artefactos.

Pero la característica más importante del muestreo aleatorio es que tiene todos los niveles de precisión (en teoría, al menos). Esto es MUY importante para los fractales: tienen detalles en todos los niveles de precisión y, por lo tanto, también requieren información de todos los niveles.

0

El muestreo aleatorio se utiliza para acercarse lo más posible a la solución exacta, que en casos como este no se puede calcular exactamente debido a la naturaleza estadística del problema.

Puede 'revisar todos los píxeles', pero como cada píxel es de hecho una región cuadrada con dimensiones dx * dy, solo usará num_x_pixels * num_y_pixels puntos para su cálculo y obtendrá resultados muy granulados.

Otra forma sería usar una resolución muy grande y reducir la escala del renderizado después del cálculo. Esto daría algún tipo de renderizado "sistemático" en el que cada píxel de la representación final se divide en cantidades iguales de subpíxeles.

Cuestiones relacionadas