2009-02-07 9 views
5

Ho creato un file Python per generare un'immagine del set Mandelbrot. Il codice matematico originale non era mio, quindi non lo capisco: l'ho modificato solo pesantemente per renderlo più veloce di 250 volte (regola Threads!).Come "ingrandire" una sezione del set Mandelbrot?

In ogni caso, mi chiedevo come avrei potuto modificare la parte matematica del codice per renderlo un bit specifico. Qui è la parte di matematica:

for y in xrange(size[1]): 
     coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth)) 
     z = complex(coords[0],coords[1]) 
     o = complex(0,0) 
     dotcolor = 0 # default, convergent 
     for trials in xrange(n): 
      if abs(o) <= 2.0: 
       o = o**2 + z 
      else: 
       dotcolor = trials 
       break # diverged 
     im.putpixel((x,y),dotcolor) 

e le definizioni di dimensioni:

size1 = 500 
size2 = 500 
n=64 
box=((-2,1.25),(0.5,-1.25)) 
plus = size[1]+size[0] 
uleft = box[0] 
lright = box[1] 
xwidth = lright[0] - uleft[0] 
ywidth = uleft[1] - lright[1] 

quello che ho bisogno di modificare per renderlo rendere una certa sezione del set?

+0

Mi manca come hai usato i thread per rendere il codice più veloce, dal momento che bytecode python e sui thread non verranno eseguiti simultaneamente a causa del GIL. – nosklo

risposta

14

La linea:

box=((-2,1.25),(0.5,-1.25)) 

è il bit che definisce l'area di spazio di coordinate che viene reso, in modo che solo bisogno di cambiare questa linea. La prima coppia di coordinate è l'area in alto a sinistra dell'area, la seconda in basso a destra.

Per ottenere una nuova coordinata dall'immagine dovrebbe essere abbastanza semplice. Hai due sistemi di coordinate, il tuo sistema di "immagine" 100x100 pixel di dimensione, l'origine a (0,0). E il tuo sistema di coordinate aereo "complesso" definito da "box". Per X:

X_complex=X_complex_origin+(X_image/X_image_width)*X_complex_width 
+0

Grazie amico! Come posso convertirli in valori X e Y? È possibile? – Lobe

+0

La scatola contiene due coppie x, y: box = ((x, y), (x, y)) Questo risponde alla tua domanda? –

+0

Ahh, mi dispiace per quello, ho avuto la parte sbagliata del bastone. Intendevo, se avessi le dimensioni dell'immagine resa completa (Say 100x100), come potrei convertire i valori x e y di una sezione dell'immagine 100x100 in un valore xey in 'zoom' in on? Dubito che sia possibile - e grazie per aver risposto! – Lobe

4

La chiave per capire come fare questo è quello di capire che cosa la linea coords = sta facendo:

coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth)) 

In effetti, i x e y valori che si sta scorrendo che corrispondono alle le coordinate del pixel sullo schermo vengono tradotte nel punto corrispondente sul piano complesso che si sta guardando. Ciò significa che la coordinata dello schermo (0,0) si tradurrà nella regione in alto a sinistra che viene visualizzata a (-2,1.25) e (1,0) sarà la stessa, ma spostata di 1/500 della distanza (presupponendo una finestra di larghezza di 500 pixel) tra la coordinata xe 0.5.

questo è esattamente ciò che la linea sta facendo - Ti espandere solo il bit X-coordinare con i nomi delle variabili più illustrativo per indicare questo:

mandel_x = mandel_start_x + (screen_x/screen_width) * mandel_width 

(Le variabili mandel_ si riferiscono alle coordinate sul piano complesso , le variabili screen_ si riferiscono alle coordinate sullo schermo del pixel in fase di plottaggio.)

Se si desidera quindi prendere una regione dello schermo per eseguire lo zoom in avanti, si desidera fare esattamente la stessa cosa: prendere le coordinate dello schermo di la regione in alto a sinistra e in quella in basso a destra, traducendole sul piano di un piano complesso dinari e rendi quelle le nuove variabili uleft and lright. cioè per ingrandire sulla scatola delimitata dalle coordinate su schermo (X1, Y1) .. (X2, Y2), utilizzare:

new_uleft = (uleft[0] + (x1/size[0]) * (xwidth), uleft[1] - (y1/size[1]) * (ywidth)) 
new_lright = (uleft[0] + (x2/size[0]) * (xwidth), uleft[1] - (y2/size[1]) * (ywidth)) 

(Ovviamente è necessario ricalcolare le dimensioni, xwidth, ywidth e altre variabili dipendenti basate sulle nuove coordinate)

Nel caso in cui sei curioso, la matematica dietro il set di mandelbrot non è così complicata (solo complessa). Tutto ciò che sta facendo è prendere una particolare coordinata, considerandola come un numero complesso, quindi ripetutamente squadrandola e aggiungendo il numero originale.

Per alcuni numeri, facendo ciò il risultato diverge, crescendo costantemente verso l'infinito mentre si ripete il processo. Per gli altri, rimarrà sempre al di sotto di un certo livello (ad esempio, ovviamente (0.0, 0.0) non diventa mai più grande sotto questo processo.L'insieme di mandelbrot (la regione nera) è quelle coordinate che non divergono. qualsiasi numero ottiene sopra la radice quadrata di 5, si divergere - il codice è solo utilizzando 2.0 come la sua approssimazione sqrt(5) (~ 2.236), ma questo non farà molta differenza notevole

di solito le regioni che divergono get. tracciato con il numero di iterazioni del processo necessarie per superare questo valore (la variabile trials nel codice) che produce le regioni colorate

Problemi correlati