2009-02-07 5 views
5

Ich habe eine Python-Datei erstellt, um ein Mandelbrot-Set-Image zu erzeugen. Der ursprüngliche mathematische Code war nicht mein, also verstehe ich ihn nicht - ich habe ihn nur stark modifiziert, um ihn etwa 250x schneller zu machen (Threads-Regel!).Wie kann man einen Abschnitt des Mandelbrot-Sets vergrößern?

Wie auch immer, ich fragte mich, wie ich den Mathe-Teil des Codes ändern könnte, damit es ein bestimmtes Bit rendert. Hier ist die Mathematik Teil:

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) 

Und die Größe Definitionen:

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] 

was muss ich ändern, um es einen bestimmten Abschnitt des Satzes zu machen machen?

+0

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

Antwort

14

Die Linie:

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

ist das Bit, das den Bereich Raum von Koordinaten definiert, die gerendert wird, so brauchen Sie nur diese Zeile zu ändern. Das erste Koordinatenpaar befindet sich oben links im Bereich, der zweite rechts unten.

Um eine neue Koordinate aus dem Bild zu erhalten, sollte ziemlich einfach sein. Sie haben zwei Koordinatensysteme, Ihr "Bild" -System mit einer Größe von 100x100 Pixeln, Ursprung bei (0,0). Und Ihr "komplexes" Ebenen-Koordinatensystem wird durch "Box" definiert. Für X:

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

Danke Mann! Wie kann ich diese in X- und Y-Werte umwandeln? Ist es möglich? – Lobe

+0

Box enthält zwei x, y-Paare: box = ((x, y), (x, y)) Beantwortet das Ihre Frage? –

+0

Ahh, tut mir leid, ich habe das falsche Ende des Stocks. Ich meinte, wenn ich die Dimensionen des vollständig gerenderten Bildes hätte (Say 100x100), wie könnte ich die x- und y-Werte eines Abschnitts des 100x100-Bildes in einen x- und y-Wert umwandeln, um hineinzuzoomen? Ich bezweifle es möglich - und danke für die Antwort! – Lobe

4

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)

Verwandte Themen