Der Schlüssel zum Verständnis, wie dies zu tun ist, zu verstehen, was die coords =
Linie tut:
coords = (uleft[0] + (x/size[0]) * (xwidth),uleft[1] - (y/size[1]) * (ywidth))
effektiv, die x
und y
Werte, die Sie durch welchen Looping entsprechen die Koordinaten des On-Screen-Pixels werden in den entsprechenden Punkt der betrachteten komplexen Ebene übersetzt. Dies bedeutet, dass (0,0)
Bildschirmkoordinate in den oberen linken Bereich verschoben wird, betrachtet (-2,1.25)
, und (1,0)
wird gleich sein, aber bewegt 1/500 der Entfernung (unter der Annahme einer 500 Pixel Breite Fenster) zwischen -2
und 0.5
x-Koordinate.
Das ist genau das, was diese Linie zu tun ist - ich werde erweitern nur der X-Koordinate Bit mit anschaulichen Variablennamen um dies anzuzeigen:
mandel_x = mandel_start_x + (screen_x/screen_width) * mandel_width
(Die mandel_
Variablen auf die Koordinaten auf der komplexen Ebene beziehen Die screen_
Variablen beziehen sich auf die Bildschirmkoordinaten des geplotteten Pixels.)
Wenn Sie dann einen Bereich des Bildschirms zum Zoomen verwenden möchten, möchten Sie genau dasselbe tun: nehmen Sie die Bildschirmkoordinaten von die obere linke und untere rechte Region, übersetzen Sie sie in die komplexe Ebene coor diniert und macht diese zu den neuen Variablen uleft und lright. dh vergrößern auf dem Feld in begrenzt durch Bildschirm-Koordinaten (x1, y1) .. (x2, y2), Verwendung:
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))
(Natürlich müssen Sie die Größe, xwidth, ywidth neu zu berechnen und andere abhängige Variablen basierend auf den neuen Koordinaten)
Falls Sie neugierig sind, ist die Mathematik hinter dem Mandelbrot nicht so kompliziert (nur komplex). Es wird nur eine bestimmte Koordinate genommen, die als komplexe Zahl behandelt wird und dann wiederholt quadriert wird und die ursprüngliche Zahl hinzugefügt wird.
Bei einigen Zahlen führt dies dazu, dass das Ergebnis divergiert und ständig in Richtung Unendlichkeit wächst, während Sie den Vorgang wiederholen. Für andere wird es immer unterhalb eines bestimmten Niveaus bleiben (zB wird offensichtlich (0,0, 0,0) unter diesem Prozess niemals größer. Das Mandelbrot-Set (der schwarze Bereich) ist die Koordinaten, die nicht divergieren eine beliebige Zahl wird über die Quadratwurzel von 5, wird es auseinander - Ihr Code nur 2.0
als Annäherung an sqrt(5)
(~ 2.236
) verwenden, aber das wird nicht viel spürbaren Unterschied machen
Normalerweise sind die Regionen, die get divergieren. Geplottet mit der Anzahl der Iterationen des Prozesses, die es braucht, um diesen Wert zu überschreiten (die trials
Variable in Ihrem Code)
Ich vermisse, wie Sie Threads verwendet, um den Code schneller zu machen, da Python Bytecode e auf Threads werden wegen der GIL nicht gleichzeitig ausgeführt. – nosklo