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
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