Seite 1 von 1

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

Verfasst: Donnerstag 12. April 2007, 18:08
von schlangenbeschwörer
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

was muss man denn da eingeben

Verfasst: Montag 16. April 2007, 14:29
von uwi2k2
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

Verfasst: Montag 16. April 2007, 21:12
von mkesper
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.

Verfasst: Montag 16. April 2007, 21:19
von Costi
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

Verfasst: Donnerstag 19. April 2007, 14:59
von schlangenbeschwörer
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

Verfasst: Donnerstag 19. April 2007, 18:24
von schlangenbeschwörer
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