2010-04-26 3 views

Répondre

4

Problème:

  • L'image est que je pense à partir du code. L'ensemble Mandelbrot a un diamètre de 2, donc vous ne voyez que quelques pixels au milieu.

Solution:

  • Modifier la méthode renderPoint d'accepter double arguments et l'appeler comme renderPoint((x - h)/100.0, (k - y)/100.0) pour voir quelque chose de plus intéressant.
  • Modifiez le nombre d'itérations et le codage couleur, car vous calculez maintenant 255 itérations pour chaque pixel interne. J'ai réussi à voir quelque chose de gentil en changeant le retour de renderPoint à return (((r << 16) | (g << 8) | b)<<4) et en réglant MaxColorBit = 16.

Une revue de code:

  • (int)Math.floor(Width/2) peut être remplacé par Width/2, parce que c'est une division entière.
  • Vous devez commencer vos attributs Width et Height avec des lettres minuscules (width et height), car il s'agit d'une convention Java qui permet de différencier les classes et les attributs.
  • L'attribut iterations n'est pas utilisé.
+0

Merci beaucoup. Cependant, pouvez-vous expliquer le décalage supplémentaire de 4 dans la ligne de retour? – SDLFunTimes

+0

C'était mon hack de codage couleur rapide et sale, parce que sinon l'image serait trop sombre pour voir (essayez-le). Le code couleur habituel est le suivant: Calculez les itérations jusqu'à ce que la condition d'arrêt soit maintenue ou qu'un nombre d'itérations prédéfini soit atteint. Vous sortez avec le nombre d'itérations réellement effectuées. Ce nombre est utilisé comme index dans une table de couleurs (une "palette"). La palette contient généralement un ou plusieurs dégradés de couleurs. Voir http://commons.wikimedia.org/wiki/File:Mandelbrot_palette_colour_editing_with_Fractint.png pour un exemple. –

2
  • Vous dessinez la fractale correctement, mais il est vraiment petit. L'ensemble de Mandelbrot se situe dans un cercle de rayon 2, de sorte qu'il couvre à peine quelques pixels au milieu de votre fenêtre 400x500.

    Vous devriez concevoir une sorte de cartographie de la fenêtre de l'écran (qui va (0,0)-(width,height)) au plan complexe, qui devrait avoir des valeurs dans le quartier de -2-2i-2+2i environ. Une solution rapide serait de diviser les expressions x-h et k-y par 100 avant de les passer à renderPoint, et de changer les arguments de renderPoint de int à double. Le mieux serait de spécifier le rectangle de visualisation désiré et de l'utiliser pour déterminer le mappage.

  • Vous calculez l'image fractale dans le fil de l'interface graphique. C'est un non-non, car l'application semblera se bloquer avant l'ouverture de la fenêtre. Je change l'invocation de render() dans le constructeur pour ressembler à ceci:

    new Thread() { 
        public void run() { render(); } 
    }.start(); 
    
+2

+1 pour suggérer d'utiliser un séparé fil. Mais dans cette situation, un 'repaint()' doit être demandé après que 'render()' soit terminé, sinon l'image calculée n'est pas affichée: 'public void run() {render(); repeindre(); } ' –

+1

Oui, bien que je mettrais la repeindre après chaque rangée se termine. –