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
Orbit-Frakttal-Painter: für Hopalongs und andere Späße
-
- User
- Beiträge: 419
- Registriert: Sonntag 3. September 2006, 15:11
- Wohnort: in den weiten von NRW
- Kontaktdaten:
- mkesper
- User
- Beiträge: 919
- Registriert: Montag 20. November 2006, 15:48
- Wohnort: formerly known as mkallas
- Kontaktdaten:
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.
Ich kann die Algorithmen nicht ändern, der Übernehmen-Knopf hat keine Funktion.
Die Funktion ist mir leider ebenfalls schleierhaft.
-
- User
- Beiträge: 419
- Registriert: Sonntag 3. September 2006, 15:11
- Wohnort: in den weiten von NRW
- Kontaktdaten:
Hallo!
Erstmal danke für die Fehlerberichte...
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.
So, versuch jetzt mal die Bugs zu beheben...
ich hoffe jetzt kommt bei euch was.
Gruß, jj
Erstmal danke für die Fehlerberichte...

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.

Also ich hab auch 2.4 und hab keinen Fehler. Was ist denn da genau falsch?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).
ja, aber da hab ich noch keine Erfahrung mit, und Postscript kenn ich auch net. Mal ausprobierenCosti hat geschrieben:binn mir nich ganz sicher, glaube aber das Canvas eine methode hat um ihren inhalt als postscript zu speichern
So, versuch jetzt mal die Bugs zu beheben...
ich hoffe jetzt kommt bei euch was.
Gruß, jj
-
- User
- Beiträge: 419
- Registriert: Sonntag 3. September 2006, 15:11
- Wohnort: in den weiten von NRW
- Kontaktdaten:
So, poste hier jetzt mal die neueste Version. Bei weiteren Änderungen ändere ich dann die und mach keine neue, so sollte das gehen.
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
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()
Gruß, jj