Orbit-Frakttal-Painter: für Hopalongs und andere Späße

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Antworten
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Donnerstag 12. April 2007, 18:08

Halllo!
So, ich hab auch wieder mal was zum Ansehen. Damit der Thread nicht gleich wieder abstürtzt, hab ich's hier reingestellt:
http://paste.pocoo.org/show/1389/

Das Programm ist...
>> je nach Angaben sehr schön anzusehen (find ich).
>> ein wahrer CPU-Killer (bei mir bis zu 100%, wobei mein PC nicht der schnellste ist).
>> flexibel und offen für eigene Algorithmen (wobei es dann glaub ich aber noch langsamer wird).

Meine Problempunkte/Verbesserungsabsichten sind...
>> Schnelligkeit verbessern
>> Canvas zoomen, bzw. je nach Größe des Fraktals den Faktor ändern
>> evtl. den Canvasinhalt in Datei speichern ((wie) geht das?)

So, jetzt schaut euch das mal an. Ich hoffe auf viel Kritik/Verbesserungsvorschläge.

MfG, jj
uwi2k2
User
Beiträge: 3
Registriert: Dienstag 10. April 2007, 19:33

Montag 16. April 2007, 14:29

hi,

also bei mir kommt immer nur ein roter punkt in der mitte...
muss ich was besonbderes eingeben ? oder brauche ich ein spezielles modul?

cu
kai
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

Montag 16. April 2007, 21:12

ALGOS={...} war bei mir syntaktisch fehlerhaft (python 2.4), eine Zeile pro Algorithmus wäre besser (dann fällt auch die falsche Einrückung auf).
Ich kann die Algorithmen nicht ändern, der Übernehmen-Knopf hat keine Funktion.
Die Funktion ist mir leider ebenfalls schleierhaft.
Costi
User
Beiträge: 544
Registriert: Donnerstag 17. August 2006, 14:21

Montag 16. April 2007, 21:19

hi!
evtl. den Canvasinhalt in Datei speichern ((wie) geht das?)
binn mir nich ganz sicher, glaube aber das Canvas eine methode hat um ihren inhalt als postscript zu speichern
cp != mv
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Donnerstag 19. April 2007, 14:59

Hallo!
Erstmal danke für die Fehlerberichte... :lol:
Ich versuch jetzt mal alle Fehler richtig zu beheben, aber damits erstmal läuft, ein paar Gebrauchshinweise:

1. Die Zahlen (die letzte nicht umbedingt) müssen als floats angegeben werden, also mit Punkt.

2. Ich glaub nicht immer kommt ein schönes Fraktal. Einfach ausprobieren. Mit großen, kleinen, negativen Zahlen...größer Null, kleiner Null, 2 gleiche, irgendwelche Bezübe...Hier ein paar Bsp.:

a/b/c:

0.5/-0.6/0.7
-0.5/0.5/0.7
-0.25/-0.6/-1.7
33/0.34/0.55
-0.25/-0.643/-3
555/1111/555
-11/0.05/-0.5

3. ZZ. muss man den Algorithmus (Nr. 1) nochmal selbst auswählen und neu laden.

Dannn kommen da schöne Dinge raus. :wink:
mkalls hat geschrieben:ALGOS={...} war bei mir syntaktisch fehlerhaft (python 2.4), eine Zeile pro Algorithmus wäre besser (dann fällt auch die falsche Einrückung auf).
Also ich hab auch 2.4 und hab keinen Fehler. Was ist denn da genau falsch?
Costi hat geschrieben:binn mir nich ganz sicher, glaube aber das Canvas eine methode hat um ihren inhalt als postscript zu speichern
ja, aber da hab ich noch keine Erfahrung mit, und Postscript kenn ich auch net. Mal ausprobieren

So, versuch jetzt mal die Bugs zu beheben...
ich hoffe jetzt kommt bei euch was.

Gruß, jj
schlangenbeschwörer
User
Beiträge: 419
Registriert: Sonntag 3. September 2006, 15:11
Wohnort: in den weiten von NRW
Kontaktdaten:

Donnerstag 19. April 2007, 18:24

So, poste hier jetzt mal die neueste Version. Bei weiteren Änderungen ändere ich dann die und mach keine neue, so sollte das gehen.

Code: Alles auswählen

# fuer Hopalongs und andere Spielereien..
# by Schlangenbeschw\xf6rer

import Tkinter as tk
from math import*

#die find ich grad nicht im mathmodul:
def sign(x):
    if x != 0:
        return x/abs(x)
    else:
       return x

ALGOS={"1. Hopalong":("y-sign(x)*(abs(b*x-c))**0.5","a-x"),
       "2. Gingerbreadman":("1-y+abs(x)","x"),
       "3. Kamtor3D": ("x*cos(a)+(x*x-y)*sin(a)","x*sin(a)-(x*x-y)*cos(a)"),
       "4. Own":("y","x")}

        

class OFP:
    def __init__(self):
        self.master=tk.Tk()        
        self.master.title("Orbit-Fraktal-Painter")

        self.algox=ALGOS.items()[0][0]
        self.algoy=ALGOS.items()[0][1]
        self.algoname=tk.StringVar()
        self.titlealgo=tk.StringVar()       
        self.algoname.trace_variable("w", self.changetitle)
        self.algoname.set("1. Hopalong")
        self.x,self.y=None,None
 
        self.mf=tk.Frame(bg="steelblue")
        self.mf.grid()
        self.can=tk.Canvas(self.mf,height=300,width=300,bg="black")
        self.can.grid(row=1,column=1,rowspan=3)

        self.bf=tk.Frame(self.mf, bg="steelblue")
        self.bf.grid(row=2, column=2)
        self.calcbut=tk.Button(self.bf,bg="white",text="berechnen",command=self.calculate)
        self.calcbut.grid(pady=1.5, sticky="we")        
        self.optbut=tk.Button(self.bf,bg="white",text="Algorithmus \xe4ndern", font=("",8,""),command=self.setalgo)
        self.optbut.grid(pady=0.5, sticky="we")
        self.newbut=tk.Button(self.bf,bg="white",text="Canvas leeren", command=self.c_reset)
        self.newbut.grid(pady=0.5, sticky="we")

        self.nvar=tk.StringVar()
        self.nvar.set("%i"% 0)
        self.indexl=tk.Label(self.mf,textvariable=self.nvar, bg="gray", relief="sunken", bd=1)
        self.indexl.grid(row=3,column=2)

        self.ef=tk.Frame(self.mf, bg="steelblue")
        self.ef.grid(row=1, column=2, padx=5)
        self.algol=tk.Label(self.ef, bg="steelblue", fg="white",textvariable=self.titlealgo, font=("",12, "bold"))
        self.algol.grid(columnspan=2, pady=5)
        self.entrys={}
        i=1
        for e in ("a","b","c","num"):
            tk.Label(self.ef,text=e+":", bg="steelblue", fg="white").grid( row=i, column=0)
            self.entrys[e]=tk.Entry(self.ef)
            self.entrys[e].grid(row=i, column=1)
            self.entrys[e].bind("<FocusOut>", self.makefloat)
            i+=1

    def setalgo(self):
        print "setalog"
        self.optop=tk.Toplevel(self.master)
        self.af=tk.Frame(self.optop,bg="steelblue")
        self.af.grid(ipadx=5,ipady=5)
        self.cbl=tk.Label(self.af, bg="gray",relief="sunken",borderwidth=2)
        self.cbl.grid(row=0,column=0,columnspan=2,sticky="we",padx=5,pady=5)
        ralgos=ALGOS.keys()
        ralgos.sort()
        i=0
        for algoname in ralgos:
            tk.Radiobutton(self.cbl,text=algoname,bg="gray",fg="black",activebackground="gray",activeforeground="black", variable=self.algoname, value=algoname,command=self.refresh).grid(row=i,column=0,sticky="w")
            i+=1
        self.xlab=tk.Label(self.af,text="xx:",bg="steelblue",fg="white")
        self.xlab.grid(row=1,column=0)
        self.xent=tk.Entry(self.af)
        self.xent.grid(row=1,column=1)
        self.ylab=tk.Label(self.af,text="yy:",bg="steelblue",fg="white")
        self.ylab.grid(row=2,column=0,padx=5)
        self.yent=tk.Entry(self.af)
        self.yent.grid(row=2,column=1,padx=5)
        self.obok=tk.Button(self.af,bg="white",text="\xfcbernehmen",command=self.newconfig)
        self.obok.grid(row=3,column=0,columnspan=2,sticky="we",padx=5,pady=5)
        self.refresh()
        
    def refresh(self,event=None):
        algo=ALGOS[self.algoname.get()]
        self.xent.delete(0,"end")
        self.xent.insert(0,algo[0])
        self.yent.delete(0,"end")
        self.yent.insert(0,algo[1])
        self.newconfig()

    def newconfig(self):
        si=self.algoname.get()
        if not(self.xent.get() == ALGOS[si][0] and  self.yent.get() == ALGOS[si][1]):
            ALGOS["Own"]=(self.xent.get(),self.yent.get())
            self.algoname.set("Own")
        self.algox,self.algoy=ALGOS[si][0],ALGOS[si][1]
        self.algoindex=si

    def makefloat(self,event):
        e=event.widget
        t=e.get().replace(",",".")
        try:
            if e==self.entrys["num"]:
                f=str(int(t))
            else:
                f=str(float(t))
        except ValueError:
            f=""
            print "Falsche Eingabe: Bitte nur Zahlen eingeben!"
        e.delete(0,"end")
        e.insert("end", f)
            
            
            

    def calculate(self):   
        a,b,c = float(self.entrys["a"].get()), float(self.entrys["b"].get()), float(self.entrys["c"].get())
        n=int( self.entrys["num"].get())
        if self.x  and self.y:
            x,y=self.x,self.y
        else:
            x,y=0,0
        self.color="red"
        ci=2500
        for i in range(n):
            if not (i%10):
                self.nvar.set(("%i"% (int(self.nvar.get())+10)).rjust(5))
                if 2*ci > i >= 1*ci:
                    self.color="magenta"
                elif 3*ci > i >= 2*ci:
                    self.color="blue"
                elif 4*ci > i >= 3*ci:
                    self.color="green"
                elif 5*ci > i >= 4*ci:
                    self.color="cyan"
                elif 6*ci > i >= 5*ci:
                    self.color="yellow"
                elif 8*ci > i >= 6*ci:
                    self.color="white"
                elif 9*ci > i >= 7*ci:
                    self.color="gray"                    
            self.can.create_oval(self.f(x,1),self.f(y,1),self.f(x,2),self.f(y,2), fill=self.color)
            self.can.update()
            if self.algoname.get() == "1. Hopalong":
                xx=y-sign(x)*(abs(b*x-c))**0.5
                yy=a-x
            elif self.algoname.get()== "2. Gingerbreadman":
                xx=1-y+abs(x)
                yy=x
            elif self.algoname.get() == "3. Kamtor3D":
                xx=x*cos(a)+(x*x-y)*sin(a)
                yy=x*sin(a)-(x*x-y)*cos(a)
            else:
                xx=eval(self.algox)
                yy=eval(self.algoy)
            x,y=xx,yy
        self.x,self.y=x,y

    def f(self,x,index):
        return ((x*10)+150)-1.000001+index

    def c_reset(self):
        for child in self.can.find_all():
            self.can.delete(child)

    def changetitle(self, *args):
        self.titlealgo.set(self.algoname.get().split()[1])

OFP().master.mainloop()
Einer der dümmsten Fehler war mal wieder, das ich aus ner ´normalen´ eine tk-Variable gemacht hab, und im Vergleich das ´.get()´ vergessen hab...Naja, jetzt sollte es einigermaßen laufen. Jetzt wird auch die Eingabe automatisch in floats umgewandelt.

Gruß, jj
Antworten