Pythonmania.de
Script different! Mein Icon

Navigation:

 Startseite
 Python bei O'Reilly
 Python & Tkinter
 Tkinter (deutsch)
 Tkinter (english)
 ftp mit Python
 Dialogboxen
 Kapitän
 Warum Python?
 Erste Schritte
 Grafische Ausgabe
 Das Modul W
 Easy Dialogs
 Mac File Dialogs
 Apfelmännchen
 Piddle & MacOS X
 Dancing Python
 User-Agenten
 XML-RPC
 Blogger API
 Anti-Spam-Script
 Template-Engine
 Python & XML
 Python Cookbook
 Impressum
 Schockwellenreiter

Python Logo

Wir backen uns ein Apfelmännchen (in Python)

Mandelbrotmenge in Python programmiert.

Python besitzt den eingebauten Zahlentyp Complex - daher ist es in Python sehr einfach, Berechnungen auf der komplexen Zahlenebene durchzuführen. Zum Zeichnen benutzen wir das Modul Python Imaging Library (PIL) zusammen mit piddle. Während PIL zur Standarddistribution von MacPython gehört, muß piddle erst runtergeladen und installiert werden.

Die Mandelbrotmenge ist ein sogenanntes Fliehzeitfraktal, bei dem jeder Punkt der komplexen Zahlenebene in die Iterationsformel

zn+1 := zn2 + c

eingesetzt wird. Ein Punkt der Ebene gehört zur Mandelbrotmenge, wenn er auch nach wiederholter Iteration einen bestimmten Radius (wir haben in in limit auf 2 gesetzt) nicht verläßt. Da wir in Python - wie oben erwähnt - direkt mit komplexen Zahlen rechnen können, ist dieser Algorithmus im Programm eindeutig zu erkennen.


from piddleQD import *
import Image, ImageDraw

def drawIt(): width = 300 height = 300 limit = 2.0
left = -2.25 right = 0.75 bottom = -1.5 top = 1.5
maxiter = 20
canvas = QDCanvas(size=(width, height)) im = Image.new("RGB", (width, height), (255, 0, 0)) draw = ImageDraw.ImageDraw(im) for x in range(width): cr = left + x*(right - left)/width for y in range(height): ci = bottom + y*(top - bottom)/height c = complex(cr, ci) z = 0.0 i = 0 for i in range(maxiter): if abs(z) > limit: break z = (z**2) + c if i == (maxiter - 1): draw.point((x, y), (0, 0, 0)) else: draw.point((x, y), (i*32, i*32, i*32)) canvas.drawImage(im, 0, 0) canvas.setInfoLine(((left, right), (top, bottom))) canvas.flush()
drawIt()

Den größten Teil des Codes machen die Parametervereinbarungen aus, der eigentliche Alogrithmus zur Berechnung der Mandelbrotmenge findet in der for-Schleife statt. Beachtenswert und piddle und PIL geschuldet ist die einfache Möglichkeit, dieses in eine grafische Ausgabe umzusetzen. Es wird einfach ein PIL-Image deklariert, daß dann auf einem piddle-Canvas ausgegeben wird.

Die Berechnung ist ziemlich flott, doch ein paar Sekunden muß ich auch auf meinem G4 TiBook warten, bis das Apfelmännchen in voller Schönheit auf dem Monitor erscheint. Es geht etwas schneller, wenn man den else-Teil in der Schleife wegläßt, der für die Graustufen in der Umgebung der Mandelbrotmenge zuständig ist.

piddleQD (das QD steht für QuickDraw, der Macintosh-Grafik-Bibliothek) läuft nur mit MacPython innerhalb der IDE, Benutzer anderer Betriebssysteme können das Programm aber leicht mit einer anderen piddle-Bibliothek anpassen, hier die geänderten Zeilen für piddleTK, eine mit Tkinter arbeitende betriebssystem-unabhängige Version von piddle:


from Tkinter import *
from piddleTK import *
[...]
canvas = TKCanvas(size=(width, height))
[...]
if __name__ == "__main__":

root = Tk() root.title("Apfelmännchen") drawIt() root.mainloop()

Die Mandelbrotmenge in Python mit TkinterWie man leicht sieht, sind die Änderungen wirklich minimal und bestehen in der Hauptsache aus dem Import und der Deklaration der entsprechenden Bibliotheken. Außerdem muß zum Schluß die für eine Tkinter-Applikation übliche mainloop durchlaufen werden, was es uns allerdings auch noch erlaubt, dem Fensterchen einen Titel zu geben. Darüberhinaus gibt es die Statuszeile bei piddleTK nicht (zumindest auf dem Mac), daher kann die Zeile


canvas.setInfoLine(((left, right), (top, bottom)))

entfallen. Das zweite Bild zeigt das Apfelmännchen in einer leicht abgewandelten Form (vor rotem Hintergrund und ohne die rechenzeitverschlingenden Farbabstufungen) in einem Tk-Fenster.

Viel Spaß bei Eurer Entdeckungsreise durch die Mandelbrotmenge.

Und... Ach ja... Natürlich funktioniert piddleQD wie die gesamte IDE auch unter OS X (nur leider (noch) nicht auf meinem Desktop, bei Dualprozessor-Maschinen hat MacPython (noch) Probleme).

Links:

Alexander F. Waltz: Die Mandelbrotmenge in Maple programmiert.

In Perl habe ich das Apfelmännchen auch schon einmal gebacken.

Die Mandelbrotmenge gehört zu den Fraktalen. Daher ist die Reise nach Fraktalien vielleicht auch interessant.


Mein Icon © Copyright 2000 - 2002: Jörg Kantel.
Last update: 13.10.2002; 21:32:23 Uhr.
This site is edited with Radio UserLand, the first personal Web Application server for Windows and Macintosh.  Let iCab smile  Site Meter