2017-05-10 4 views
0

Je veux générer des fractales d'une image comme this en utilisant python. Le code que j'ai trouvé génère des fractales normales et j'ai été incapable de trouver de l'aide sur la façon de reproduire les fractales pour une image. Le code utilisé pour générer les Fractales est -Générer des fractales avec python

from numpy import * 

def mandel(n, m, itermax, xmin, xmax, ymin, ymax): 

    ''' 
    (n, m) are the output image dimensions 
    itermax is the maximum number of iterations to do 
    xmin, xmax, ymin, ymax specify the region of the 
    set to compute. 
    ''' 

    ix, iy = mgrid[0:n, 0:m] 
    x = linspace(xmin, xmax, n)[ix] 
    y = linspace(ymin, ymax, m)[iy] 
    c = x+complex(0,1)*y 
    del x, y 
    img = zeros(c.shape, dtype=int) 
    ix.shape = n*m 
    iy.shape = n*m 
    c.shape = n*m 
    z = copy(c) 
    for i in xrange(itermax): 
     if not len(z): 
      break 
     multiply(z, z, z) 
     add(z, c, z) 
     rem = abs(z)>2.0 
     img[ix[rem], iy[rem]] = i+1 
     rem = -rem 
     z = z[rem] 
     ix, iy = ix[rem], iy[rem] 
     c = c[rem] 
    return img 

if __name__=='__main__': 
    from pylab import * 
    import time 
    start = time.time() 
    I = mandel(512, 512, 100, -2, .5, -1.25, 1.25) 
    print 'Time taken:', time.time()-start 
    I[I==0] = 101 
    img = imshow(I.T, origin='lower left') 
    img.write_png('../images/mandel.png') 
    show() 

Je dois savoir comment puis-je utiliser une image de base autour de laquelle les Fractales doivent être construits. Quelqu'un peut-il me diriger dans la bonne direction?

Répondre

0

Il est appelé Orbit Trap. Fondamentalement, à l'intérieur de la boucle, vous avez la valeur actuelle de l'orbite z. Pour chaque valeur dans l'orbite (donc, chaque valeur de z) vérifie si cette valeur correspond à une certaine coordonnée à l'intérieur de l'image. Si oui, vous renvoyez la couleur correspondante de ce pixel. Le reste est complètement le même que pour l'algorithme de temps d'échappement normal. J'utilise le pseudo code similaire à C++ pour illustrer le cas le plus simple: scale (int x, int y) est une fonction qui retourne un nombre complexe qui correspond aux coordonnées de x, y, unscale est sa partie compteur .

int getcolor(int x, int y, int maxiter) { 
    complex z = 0; 
    complex c = scaled(x, y) 
    for(int i = 0; i < maxiter; ++i) { 
     z = z * z + c; 

     // these 3 lines are where the magic happens 
     if(unscale(z) is within image bounds) { 
      color = image[unscale(z)]; 
      return color; 
     } 

     if(abs(z) > 2) return color based on i; 
    } 
    return 0; // lake 
} 

Je ne peux pas vraiment suivre votre code python avec toutes les compréhensions de la liste.

Une fois que vous l'avez mis en marche, il y a plein de choses à découvrir et à modifier. Wikipedia a quelques informations plus générales https://en.wikipedia.org/wiki/Orbit_trap En outre, ce blog pourrait vous donner plus d'idées: http://iquilezles.org/www/articles/ftrapsbitmap/ftrapsbitmap.htm