2009-09-29 2 views
15

J'essaie de mettre en œuvre buddhabrot fractal. Je ne peux pas comprendre une chose: toutes les implémentations que j'ai inspectées choisissent des points aléatoires sur l'image pour calculer le chemin de la particule qui s'échappe. Pourquoi font-ils cela? Pourquoi ne pas aller sur tous les pixels?Fractale Buddhabrot

À quoi servent les points aléatoires? Plus de points font de meilleures images, donc je pense que passer au dessus de tous les pixels donne la meilleure image - ai-je tort ici?

De mes données de test:

travail sur l'image 400x400. Donc 160 000 pixels à parcourir si je vais partout.

Utilisation de l'échantillonnage aléatoire, L'image commence à prendre forme après 1 million de points. De bons résultats montrent environ 1 milliard de points aléatoires, ce qui prend des heures à calculer.

+0

En ce qui concerne votre édition - est-ce que les données de test provenant de l'échantillonnage aléatoire, ou par la méthode de la force brute de parcourir tous les pixels? Bien que je m'attends à ce que l'échantillonnage aléatoire soit plus rapide (en moyenne), je serais curieux de voir comment les deux méthodes * se comparent réellement pour vous en pratique. – Streklin

+1

mon erreur a oublié de le mentionner. Ces données proviennent d'un échantillonnage aléatoire. –

+1

Hmm, les chiffres semblent un peu étranges alors - comment faites-vous votre échantillonnage aléatoire - je pense qu'après un milliard de points, vous auriez capturé chaque point d'intérêt au moins quelques fois (bien qu'il n'y ait aucune garantie de) à partir d'un échantillon de 160 000. Obtenez-vous la même qualité d'image lorsque vous examinez chaque pixel une fois par force brute? – Streklin

Répondre

31

L'échantillonnage aléatoire est meilleur que l'échantillonnage de grille pour deux raisons principales. D'abord parce que l'échantillonnage en grille va introduire des artefacts de type grille dans l'image résultante. La deuxième est parce que l'échantillonnage de la grille peut ne pas vous donner assez d'échantillons pour une image résultante convergente. Si après avoir terminé une passe de grille, vous vouliez plus d'échantillons, vous devriez faire une autre passe avec une grille légèrement décalée (pour ne pas rééchantillonner les mêmes points) ou passer à une grille plus fine qui pourrait faire plus de travail que nécessaire . L'échantillonnage aléatoire donne des résultats très doux et vous pouvez arrêter le processus dès que l'image a convergé ou que vous êtes satisfait des résultats. Je suis l'inventeur de la technique, donc vous pouvez me faire confiance à ce sujet. :-)

1

Bien que je ne sois pas 100% conscient de la raison exacte, je suppose que cela a plus à voir avec l'efficacité. Si vous allez parcourir plusieurs fois chaque point, cela va gâcher beaucoup de cycles de traitement pour obtenir une image qui ne sera pas beaucoup mieux. En faisant un échantillonnage aléatoire, vous pouvez réduire la quantité de travail à effectuer - et étant donné que la taille de l'échantillon est suffisamment grande, il est difficile de «différencier» l'itération sur tous les pixels (d'un point de vue visuel).

0

C'est peut-être une sorte de Monte-Carlo method donc oui, aller sur tous les pixels produirait le résultat parfait mais cela prendrait énormément de temps. Pourquoi ne pas simplement essayer et voir ce qui se passe?

+5

Je pense que vous et d'autres êtes un peu accrochés sur la même hypothèse tacite qu'il n'y a qu'un nombre fini de points de départ. Les pixels ne sont pas des points; ce sont des régions carrées. Commencer avec différents points dans un pixel donné peut générer des trajectoires radicalement différentes. –

3

Il en va de même pour les fractales de flammes: les brins de Bouddha concernent les attracteurs, donc même si vous commencez par un point aléatoire, on suppose qu'il converge assez rapidement vers ces courbes d'attraction. Vous évitez généralement de peindre les 10 premiers pixels de l'itération ou de toute façon, donc le point de départ n'est pas vraiment pertinent, MAIS, pour éviter de faire deux fois le même calcul, l'échantillonnage aléatoire est bien meilleur. Comme mentionné, il élimine le risque d'artefacts.

Mais la caractéristique la plus importante de l'échantillonnage aléatoire est qu'il a tous les niveaux de précision (en théorie, au moins). C'est TRÈS important pour les fractales: elles ont des détails sur tous les niveaux de précision, et nécessitent donc des contributions de tous les niveaux.

0

L'échantillonnage aléatoire est utilisé pour se rapprocher le plus possible de la solution exacte, ce qui dans de tels cas ne peut pas être calculé exactement en raison de la nature statistique du problème.

Vous pouvez parcourir tous les pixels, mais comme chaque pixel est en fait une région carrée avec des dimensions dx * dy, vous n'utilisez que des points num_x_pixels * num_y_pixels pour vos calculs et obtenez des résultats très granuleux.

Une autre façon serait d'utiliser une très grande résolution et réduire le rendu après le calcul. Cela donnerait une sorte de rendu "systématique" où chaque pixel du rendu final est divisé en quantités égales de sous-pixels.