2010-12-10 15 views
1

J'ai réussi à implémenter l'ensemble mandelbrot comme décrit dans l'article wikipedia, mais je ne sais pas comment zoomer dans une section spécifique. Voici le code que je utilise:comment zoomer mandelbrot set

+(void)createSetWithWidth:(int)width Height:(int)height Thing:(void(^)(int, int, int, int))thing 
{ 
    for (int i = 0; i < height; ++i) 
    for (int j = 0; j < width; ++j) 
    { 
     double x0 = ((4.0f * (i - (height/2)))/(height)) - 0.0f; 
     double y0 = ((4.0f * (j - (width/2)))/(width)) + 0.0f; 
     double x = 0.0f; 
     double y = 0.0f; 

     int iteration = 0; 
     int max_iteration = 15; 

     while ((((x * x) + (y * y)) <= 4.0f) && (iteration < max_iteration)) 
     { 
      double xtemp = ((x * x) - (y * y)) + x0; 
      y = ((2.0f * x) * y) + y0; 
      x = xtemp; 
      iteration += 1; 
     } 

     thing(j, i, iteration, max_iteration); 
    } 
} 

Il était entendu que ma x0 devrait être comprise entre -2,5-1 et y0 devrait être compris entre -1 et - 1, en réduisant et que ce nombre serait zoomer, mais ça n'a pas vraiment marché du tout. Comment puis-je zoomer?

+0

également, l'ensemble complet est contenu dans -2

+0

Pour les "zooms interminables", je crois que certaines propriétés de l'algorithme fractal lui-même sont utilisées. –

Répondre

2

d'abord, avec une max_iteration de 15, vous n'allez pas voir beaucoup de détails. le mien a 1000 itérations par point comme référence, et peut aller à environ 8000 itérations avant qu'il ne devienne trop lent à attendre.

cela pourrait aider: http://jc.unternet.net/src/java/com/jcomeau/Mandelbrot.java

cela aussi: http://www.wikihow.com/Plot-the-Mandelbrot-Set-By-Hand

+0

J'étais en train de créer un grand ensemble et je voulais qu'il soit plus rapide, alors mettez-le à 15 ... c'était 1000 auparavant. – Nippysaurus

+0

Plus vous zoomerez, plus vous aurez besoin d'itérations pour voir les différences entre les points. Trop peu d'itérations et vous verrez juste une couleur. À des zooms plus élevés, vous aurez besoin de plus d'itérations pour afficher les détails. –

2

Supposons que le centre est le (cx, cy) et la longueur que vous souhaitez afficher est (Ix, Iy), vous pouvez utiliser les éléments suivants formule de mise à l'échelle:

x0 = cx + (i/largeur - 0,5) * lx;

y0 = cy + (j/largeur - 0,5) * ly;

ce qu'il fait est d'abord réduire le pixel à l'intervalle unitaire (0 < = i/largeur < 1), puis déplacer le centre (-0,5 < = i/largeur 0,5 < 0,5), de l'échelle jusqu'à la dimension désirée (-0,5 * lx < = (i/largeur-0,5) * lx < 0,5 * lx). Enfin, déplacez-le au centre que vous avez donné.