Apfelmännchen -> z²+c
Verfasst: 02.07.2006 19:52

Zum Thema z²+c hab ich auch noch was gemacht.
Mit dem Programm kann man sich auch durch das Fraktale durchzoomen und so(das geht ziemlich gut und schnell).
WICHTIG: Debugger AUS!!!
Der bremst das nämlich sehr.
Man kann den Ausschnitt, den man gerade sieht auch als Bild speichern
(Einstellungen bezüglich der Größe und des Formats, ich empfehle PNG, kann man auch machen).
Besser is aber, wenn man's als ".frac"-Datei speichern lässt(speichert die zur Berechnung wichtigen Daten), weil's dann nur'n paar Bytes groß ist und man beim öffnen mit dem Programm gleich weiterzoomen kann(anders als beim Bild).

Hatt bisher noch keine Zeit in zu kommentieren(kommt noch).
Wenn sich jemand wundert, dass einige Buttons erst beim Laufen des Programms angemalt werden, dann liegt's dadran, dass ich hier ja keine Bilder mitliefern kann.
Leider ist der Code aufgrund dessen, was das Programm bisher kann sehr umfangreich (ca. 1140 Zeilen).

Aber probiert's mal aus, sieht lustig aus!!!
Code: Alles auswählen
Parameter$=ProgramParameter()
;-Identifier
Enumeration
#Fraktale_Fenster
#Maus_Info
#X_Anzeige_Text
#X_Anzeige_Zahl
#Y_Anzeige_Text
#Y_Anzeige_Zahl
#SeedValue_Info
#SeedValueX_Text
#SeedValueX_Zahl
#SeedValueY_Text
#SeedValueY_Zahl
#Startwerte
#X_Startwert_Text
#X_Startwert_Zahl
#Y_Startwert_Text
#Y_Startwert_Zahl
#Fraktale_Gadget
#Fraktale_Bild
#Fraktale_Copy
#Verlauf_Bild
#Verlauf_Gadget
#Iterationszahl_Skala
#Iterationstiefe_Info
#Iterationstiefe_Text
#Iterationstiefe_Zahl
#Iterationstiefe_Farbe
#Iterationstiefe_Gadget
#Aequipotentiallinien
#Ja
#Nein
#Start
#Zoom_Faktor_Info
#Zoom_Faktor_Text
#Zoom_Faktor_Zahl
#Vergroesserung_Info
#Vergroesserung_Text
#ToolBar_Bar
#ToolBar_New
#ToolBar_Open
#ToolBar_Save
#ToolBar_Print_Datei
#Bitmap
#ToolBar_Info
#ToolBar_Image
#Tool_Moviemode
#Tool_Undo
#Tool_Play
#Tool_Make
#Moviemode
#Undo
#Play
#Make
#Menu
EndEnumeration
;-Initialisierungen
InitSprite()
InitSprite3D()
UseJPEGImageDecoder()
UseJPEGImageEncoder()
UsePNGImageDecoder()
UsePNGImageEncoder()
;-Datasection
;DataSection
; Mode:
; IncludeBinary "Moviemode.bmp"
; Mode2:
; IncludeBinary "Moviemode2.bmp"
; Undo:
; IncludeBinary "Undo.bmp"
; Play:
; IncludeBinary "Play.bmp"
; Make:
; IncludeBinary "Make.bmp"
;EndDataSection
;-Variablen-Deklaration
;Rechen-Variablen
;Maus-Variablen
Maus_X_vorher.l
Maus_Y_vorher.l
Global fx,fy,Maus_X_aktuell.l,Maus_Y_aktuell.l,KonstanteX.d,KonstanteY.d,SeedValueX.d,SeedValueY.d,X_Startwert.d,Y_Startwert.d,Schrittweite.d,KantenlaengePixel.l,KantenlaengeOriginal.d,Aequipotentiallinien.l,a.d,b.d,x.d,y.d,Realanteil.d,Imaginaeranteil.d,Versuche,Betrag.d,PixelX.l,PixelY.l,Vergroesserung.d,Zoomfaktor.d,Movie,Group
X_Startwert = -2.5
Y_Startwert = -2.5
KantenlaengePixel = 470
KantenlaengeOriginal = 5
Schrittweite=KantenlaengeOriginal/KantenlaengePixel
Zoomfaktor=6
Vergroesserung =1
Aequipotentiallinien =0
;-Prozeduren
Global Dim Iteration(472,472)
Procedure Berechne_Fraktale()
b=Y_Startwert
For PixelY=0 To 470
a=X_Startwert
For PixelX=0 To 470
SeedValueX=a
SeedValueY=b
x=KonstanteX
y=KonstanteY
Versuche=0
Betrag=0
While ( Versuche < 255 And Betrag < 5 )
Versuche = Versuche + 1
Betrag = x*x + y*y
;Funktions-Beschreibung
Realanteil=x*x-y*y +SeedValueX
Imaginaeranteil=2*x*y +SeedValueY
x=Realanteil
y=Imaginaeranteil
Wend
Iteration(PixelX,PixelY) = Versuche
a = a + Schrittweite
Next PixelX
b = b + Schrittweite
Next PixelY
StartDrawing(ImageOutput(#Fraktale_Bild))
If Aequipotentiallinien=1
Box(0,0,470,470,RGB(255,255,255))
For PixelX=0 To 470
For PixelY=0 To 470
If Iteration(PixelX,PixelY+1)<>Iteration(PixelX,PixelY) Or Iteration(PixelX+1,PixelY)<>Iteration(PixelX,PixelY)
Plot(PixelX,PixelY,RGB(0,0,0))
Else
drawpoint:
If Iteration(PixelX,PixelY)<51 ;rot-gelb
Plot(PixelX,PixelY,RGB(255,5*Iteration(PixelX,PixelY),0))
ElseIf Iteration(PixelX,PixelY)>50 And Iteration(PixelX,PixelY)<102 ;gelb-grün
Plot(PixelX,PixelY,RGB(255-5*(Iteration(PixelX,PixelY)-1*51),255,0))
ElseIf Iteration(PixelX,PixelY)>101 And Iteration(PixelX,PixelY)<153 ;grün-türkis
Plot(PixelX,PixelY,RGB(0,255,5*(Iteration(PixelX,PixelY)-2*51)))
ElseIf Iteration(PixelX,PixelY)>152 And Iteration(PixelX,PixelY)<204 ;türkis-blau
Plot(PixelX,PixelY,RGB(0,255-5*(Iteration(PixelX,PixelY)-3*51),255))
ElseIf Iteration(PixelX,PixelY)>203 And Iteration(PixelX,PixelY)<255 ;blau-violett
Plot(PixelX,PixelY,RGB(5*(Iteration(PixelX,PixelY)-4*51),0,255))
ElseIf Iteration(PixelX,PixelY)=255 ;weiß
Plot(PixelX,PixelY,RGB(255,255,255))
EndIf
EndIf
Next PixelY
Next PixelX
Else
Box(0,0,470,470,RGB(0,0,0))
For PixelX=0 To 470
For PixelY=0 To 470
If Iteration(PixelX,PixelY)<51 ;rot-gelb
Plot(PixelX,PixelY,RGB(255,5*Iteration(PixelX,PixelY),0))
ElseIf Iteration(PixelX,PixelY)>50 And Iteration(PixelX,PixelY)<102 ;gelb-grün
Plot(PixelX,PixelY,RGB(255-5*(Iteration(PixelX,PixelY)-1*51),255,0))
ElseIf Iteration(PixelX,PixelY)>101 And Iteration(PixelX,PixelY)<153 ;grün-türkis
Plot(PixelX,PixelY,RGB(0,255,5*(Iteration(PixelX,PixelY)-2*51)))
ElseIf Iteration(PixelX,PixelY)>152 And Iteration(PixelX,PixelY)<204 ;türkis-blau
Plot(PixelX,PixelY,RGB(0,255-5*(Iteration(PixelX,PixelY)-3*51),255))
ElseIf Iteration(PixelX,PixelY)>203 And Iteration(PixelX,PixelY)<255 ;blau-violett
Plot(PixelX,PixelY,RGB(5*(Iteration(PixelX,PixelY)-4*51),0,255))
ElseIf Iteration(PixelX,PixelY)=255 ;weiß
Plot(PixelX,PixelY,RGB(0,0,0))
EndIf
Next PixelY
Next PixelX
EndIf
StopDrawing()
EndProcedure
Procedure IterationDepth()
If Maus_X_aktuell>470 Or Maus_Y_aktuell>470
Else
it=Iteration(Maus_X_aktuell,Maus_Y_aktuell)
SetGadgetText(#Iterationstiefe_Zahl,Str(it))
StartDrawing(ImageOutput(#Iterationstiefe_Farbe))
If it<51 ;rot-gelb
Box(0,0,127+fx,50,RGB(255,5*it,0))
ElseIf it>50 And it<102 ;gelb-grün
Box(0,0,127+fx,50,RGB(255-5*(it-1*51),255,0))
ElseIf it>101 And it<153 ;grün-türkis
Box(0,0,127+fx,50,RGB(0,255,5*(it-2*51)))
ElseIf it>152 And it<204 ;türkis-blau
Box(0,0,127+fx,50,RGB(0,255-5*(it-3*51),255))
ElseIf it>203 And it<255 ;blau-violett
Box(0,0,127+fx,50,RGB(5*(it-4*51),0,255))
ElseIf it=255 ;weiß
If Aequipotentiallinien=1
Box(0,0,127+fx,50,RGB(255,255,255))
Else
Box(0,0,127+fx,50,RGB(0,0,0))
EndIf
EndIf
StopDrawing()
EndIf
EndProcedure
Procedure OpenPreferenceWindow()
CopyImage(#Fraktale_Bild,#Fraktale_Copy)
SetGadgetState(#Fraktale_Gadget,ImageID(#Fraktale_Copy))
If Movie=0
OpenPreferences("Fractal.prefs")
Enumeration #PB_Compiler_EnumerationValue
#Preferences
#Panel
#Typ
#Typ_Text
#Typ_Typ
#Typ_Info
#Size
#Size_Text
#Size_Size
#Size_Info
#Auf
#Auf_Text
#Auf_Auf
#Auf_Info
#Time
#Time_Text
#Time_Time
#Time_Info
#OK
#Abbrechen
#Uebernehmen
EndEnumeration
DisableWindow(#Fraktale_Fenster,1)
OpenWindow(#Preferences,0,0,400,400,"Einstellungen",#PB_Window_MinimizeGadget|#PB_Window_WindowCentered,WindowID(#Fraktale_Fenster))
StickyWindow(#Preferences,1)
CreateGadgetList(WindowID(#Preferences))
ButtonGadget(#OK,5,375,130,20,"OK")
ButtonGadget(#Abbrechen,135,375,130,20,"Abbrechen")
ButtonGadget(#Uebernehmen,265,375,130,20,"Übernehmen"):DisableGadget(#Uebernehmen,1)
PanelGadget(#Panel,5,5,390,365)
AddGadgetItem(#Panel,-1,"Bitmap",ImageID(#ToolBar_Image))
Frame3DGadget(#Typ,5,5,375,100,"Speicher - Format")
TextGadget(#Typ_Info,10,20,365,30,"Wählen Sie das Speicherformat, in dem die Fraktale als Bilder gespeichert werden sollen :")
ComboBoxGadget(#Typ_Typ,90,33,285,20)
AddGadgetItem(#Typ_Typ,0,"Bitmap - Format")
AddGadgetItem(#Typ_Typ,1,"JPEG - Format")
AddGadgetItem(#Typ_Typ,2,"PNG - Format")
TextGadget(#Typ_Text,10,55,365,45,"",#PB_Text_Border)
Frame3DGadget(#Size,5,115,375,220,"Größeneinstellungen")
TextGadget(#Size_Info,10,130,365,20,"Wählen Sie die Größe des zu erstellenden Bildes:")
ComboBoxGadget(#Size_Size,10,150,120,20)
AddGadgetItem(#Size_Size,0,"470 X 470")
AddGadgetItem(#Size_Size,1,"512 X 512")
AddGadgetItem(#Size_Size,2,"1024 X 1024")
AddGadgetItem(#Size_Size,3,"2048 X 2048")
AddGadgetItem(#Size_Size,4,"4096 X 4096")
TextGadget(#Size_Text,10,175,365,150,"",#PB_Text_Border)
CloseGadgetList()
textt1$="Beim speichern im Bitmap - Format werden die Farbinformation des Bildes unkomprimiert gespeichert. Dies resultiert in sehr genauen, aber auch sehr großen Bilddateien."
textt2$="Beim JPEG - Format werden die Farbinformationen kompimiert. So erhalten Sie wesentlich kleinere Bilder als beim Bitmap - Format (nützlich bei großen Bildern mit hoher Auflösung), die jedoch qualitativ etwas schlechter sind."
textt3$="Beim PNG - Format werden die Farbinformationen komprimiert, jedoch gehen hier (anders als beim JPEG - Format) keine Farbinformationen verloren, sodass die Bilder genau bleiben."
texts1$="Auflösung 470 X 470 :"+Chr(10)+"Dies ist die Auflösung des Programmbildschirms. Wenn Sie ihre Fraktale in dieser Größe speichern wollen, muss der Bildschirm nur "+Chr(34)+"abfotografiert"+Chr(34)+" werden. Somit kann das Bild sehr schnell gespeichert werden. In allen anderen Fällen wird das Bild vor dem speichern neu berechnet (dies nimmt teilweise viel zeit in Anspruch)."+Chr(10)+"Speichergröße im Bitmap - Format : ca. 650 KB"
texts2$="Auflösung 512 X 512 :"+Chr(10)+"Das Bild wird in der Auflösung 512 X 512 berechnet."+Chr(10)+"Speichergröße im Bitmap - Format : ca. 770 KB"
texts3$="Auflösung 1024 X 1024 :"+Chr(10)+"Das Bild wird in der Auflösung 1024 X 1024 berechnet."+Chr(10)+"Speichergröße im Bitmap - Format : ca. 3 MB"
texts4$="Auflösung 2048 X 2048 :"+Chr(10)+"Das Bild wird in der Auflösung 2048 X 2048 berechnet ( Zeit ! )."+Chr(10)+"Speichergröße im Bitmap - Format : ca. 12 MB"
texts5$="Auflösung 4096 X 4096 :"+Chr(10)+"Das Bild wird in der Auflösung 4096 X 4096 berechnet ( Zeit ! )."+Chr(10)+"Speichergröße im Bitmap - Format : ca. 48 MB"
Select ReadPreferenceString("SaveType","Bitmap - Format")
Case "Bitmap - Format"
SetGadgetText(#Typ_Text,textt1$)
SetGadgetState(#Typ_Typ,0)
Case "JPEG - Format"
SetGadgetText(#Typ_Text,textt2$)
SetGadgetState(#Typ_Typ,1)
Case "PNG - Format"
SetGadgetText(#Typ_Text,textt3$)
SetGadgetState(#Typ_Typ,2)
EndSelect
Select ReadPreferenceString("SaveSize","470 X 470")
Case "470 X 470"
SetGadgetText(#Size_Text,texts1$)
SetGadgetState(#Size_Size,0)
Case "512 X 512"
SetGadgetText(#Size_Text,texts2$)
SetGadgetState(#Size_Size,1)
Case "1024 X 1024"
SetGadgetText(#Size_Text,texts3$)
SetGadgetState(#Size_Size,2)
Case "2048 X 2048"
SetGadgetText(#Size_Text,texts4$)
SetGadgetState(#Size_Size,3)
Case "4096 X 4096"
SetGadgetText(#Size_Text,texts5$)
SetGadgetState(#Size_Size,4)
EndSelect
Time=Val(ReadPreferenceString("Time","500"))
If Time<500
Time=500
SetGadgetState(#Time_Time,Time)
SetGadgetText(#Time_Text,texttime$+Str(Time)+" Millisekunden.")
ElseIf Time>2500
Time=2500
SetGadgetState(#Time_Time,Time)
SetGadgetText(#Time_Text,texttime$+Str(Time)+" Millisekunden.")
Else
SetGadgetState(#Time_Time,Time)
SetGadgetText(#Time_Text,texttime$+Str(Time)+" Millisekunden.")
EndIf
Select ReadPreferenceString("Auf","470 X 470")
Case "470 X 470"
SetGadgetText(#Auf_Text,"Beim Aufnehmen wird in diesem Modus bei jedem "+Chr(34)+"Klick"+Chr(34)+" per Screenshot das neu entstandene Bild abfotografiert (spart viel Zeit).")
SetGadgetState(#Auf_Auf,0)
Case "512 X 512"
SetGadgetText(#Auf_Text,"In diesem Aufnahmemodus wird nach jedem "+Chr(34)+"Klick"+Chr(34)+" das neu entstandene Bild in der Auflösung 512 X 512 neu berechnet und gespeichert.")
SetGadgetState(#Auf_Auf,1)
Case "1024 X 1024"
SetGadgetText(#Auf_Text,"In diesem Aufnahmemodus wird nach jedem "+Chr(34)+"Klick"+Chr(34)+" das neu entstandene Bild in der Auflösung 1024 X 1024 neu berechnet und gespeichert.")
SetGadgetState(#Auf_Auf,2)
Default
SetGadgetText(#Auf_Text,"Beim Aufnehmen wird in diesem Modus bei jedem "+Chr(34)+"Klick"+Chr(34)+" per Screenshot das neu entstandene Bild abfotografiert (spart viel Zeit).")
SetGadgetState(#Auf_Auf,0)
EndSelect
Repeat
p_event=WaitWindowEvent()
Select EventWindow()
Case #Fraktale_Fenster
p_event=0
Case #Preferences
Select p_event
Case #PB_Event_Gadget
Select EventGadget()
Case #Typ_Typ
cont$=GetGadgetText(#Typ_Typ)
If cont$<>ReadPreferenceString("SaveType","Bitmap - Format")
DisableGadget(#Uebernehmen,0)
EndIf
Select cont$
Case "Bitmap - Format"
SetGadgetText(#Typ_Text,textt1$)
Case "JPEG - Format"
SetGadgetText(#Typ_Text,textt2$)
Case "PNG - Format"
SetGadgetText(#Typ_Text,textt3$)
EndSelect
Case #Size_Size
cont$=GetGadgetText(#Size_Size)
If cont$<>ReadPreferenceString("SaveSize","470 X 470")
DisableGadget(#Uebernehmen,0)
EndIf
Select cont$
Case "470 X 470"
SetGadgetText(#Size_Text,texts1$)
Case "512 X 512"
SetGadgetText(#Size_Text,texts2$)
Case "1024 X 1024"
SetGadgetText(#Size_Text,texts3$)
Case "2048 X 2048"
SetGadgetText(#Size_Text,texts4$)
Case "4096 X 4096"
SetGadgetText(#Size_Text,texts5$)
EndSelect
Case #Time_Time
cont$=GetGadgetText(#Time_Time)
If cont$<>ReadPreferenceString("Time","500")
DisableGadget(#Uebernehmen,0)
EndIf
SetGadgetText(#Time_Text,texttime$+GetGadgetText(#Time_Time)+" Millisekunden.")
Case #Auf_Auf
cont$=GetGadgetText(#Auf_Auf)
If cont$<>ReadPreferenceString("Auf","470 X 470")
DisableGadget(#Uebernehmen,0)
EndIf
Select GetGadgetText(#Auf_Auf)
Case "470 X 470"
SetGadgetText(#Auf_Text,"Beim Aufnehmen wird in diesem Modus bei jedem "+Chr(34)+"Klick"+Chr(34)+" per Screenshot das neu entstandene Bild abfotografiert (spart viel Zeit).")
Case "512 X 512"
SetGadgetText(#Auf_Text,"In diesem Aufnahmemodus wird nach jedem "+Chr(34)+"Klick"+Chr(34)+" das neu entstandene Bild in der Auflösung 512 X 512 neu berechnet und gespeichert.")
Case "1024 X 1024"
SetGadgetText(#Auf_Text,"In diesem Aufnahmemodus wird nach jedem "+Chr(34)+"Klick"+Chr(34)+" das neu entstandene Bild in der Auflösung 1024 X 1024 neu berechnet und gespeichert.")
EndSelect
Case #Uebernehmen
WritePreferenceString("SaveType",GetGadgetText(#Typ_Typ))
WritePreferenceString("SaveSize",GetGadgetText(#Size_Size))
WritePreferenceString("Time",GetGadgetText(#Time_Time))
WritePreferenceString("Auf",GetGadgetText(#Auf_Auf))
DisableGadget(#Uebernehmen,1)
Case #Abbrechen
WindowEvent()
Break
Case #OK
WritePreferenceString("SaveType",GetGadgetText(#Typ_Typ))
WritePreferenceString("SaveSize",GetGadgetText(#Size_Size))
WritePreferenceString("Time",GetGadgetText(#Time_Time))
WritePreferenceString("Auf",GetGadgetText(#Auf_Auf))
WindowEvent()
Break
EndSelect
EndSelect
EndSelect
Until p_event=#PB_Event_CloseWindow
StickyWindow(#Preferences,0)
CloseWindow(#Preferences)
DisableWindow(#Fraktale_Fenster,0)
ClosePreferences()
Else
MessageRequester("Achtung!","Um die Einstellungen zu öffnen, bitte zuerst Animationsaufnahme ausschalten!")
EndIf
EndProcedure
Procedure SaveFractalImage(XStart.d,YStart.d,KX.d,KY.d,SVX.d,SVY.d,KL.d,Aeq)
CopyImage(#Fraktale_Bild,#Fraktale_Copy)
SetGadgetState(#Fraktale_Gadget,ImageID(#Fraktale_Copy))
Enumeration #PB_Compiler_EnumerationValue
#Bild
#showwindow
#showprogress
EndEnumeration
OpenPreferences("Fractal.prefs")
Select ReadPreferenceString("SaveType","Bitmap - Format")
Case "Bitmap - Format"
format=#PB_ImagePlugin_BMP
en$="bmp"
Case "JPEG - Format"
format=#PB_ImagePlugin_JPEG
en$="jpg"
Case "PNG - Format"
format=#PB_ImagePlugin_PNG
en$="png"
Default
format=#PB_ImagePlugin_BMP
en$="bmp"
EndSelect
Select ReadPreferenceString("SaveSize","470 X 470")
Case "470 X 470"
auto=1
Case "512 X 512"
auto=0
width=512
Case "1024 X 1024"
auto=0
width=1024
Case "2048 X 2048"
auto=0
width=2048
Case "4096 X 4096"
auto=0
width=4096
Default
auto=1
EndSelect
ClosePreferences()
Select auto
Case 0
Save$=SaveFileRequester("Speichern unter","","Bild - Dateien|*."+en$,0)
If Save$<>""
If GetExtensionPart(Save$)<>en$
Save$+"."+en$
EndIf
Else
ProcedureReturn 0
EndIf
OpenWindow(#showwindow,0,0,400,20,"Bitte warten - Fortschritt - 0%",#PB_Window_WindowCentered,WindowID(#Fraktale_Fenster))
StickyWindow(#showwindow,1)
CreateGadgetList(WindowID(#showwindow))
ProgressBarGadget(#showprogress,0,0,400,20,0,width*width)
schrittweiteb.d=KL/width
Dim Pixel(width+1,width+1)
b.d=YStart
For PixelY=0 To width
a.d=XStart
For PixelX=0 To width
SVX.d=a
SVY.d=b
x.d=KX
y.d=KY
Versuche=0
Betrag.d=0
While ( Versuche < 255 And Betrag < 5 )
Versuche = Versuche + 1
Betrag = x*x + y*y
;Funktions-Beschreibung
Realanteil.d=x*x-y*y +SVX
Imaginaeranteil.d=2*x*y +SVY
x=Realanteil
y=Imaginaeranteil
Wend
gp+1
Pixel(PixelX,PixelY) = Versuche
a = a + Schrittweiteb
Next PixelX
SetGadgetState(#showprogress,gp)
SetWindowTitle(#showwindow,"Bitte warten - Fortschritt - "+StrF(PixelY/width*100,1)+"%")
b = b + Schrittweiteb
Next PixelY
CreateImage(#Bild,width,width)
StartDrawing(ImageOutput(#Bild))
If Aeq=1
Box(0,0,width,width,RGB(255,255,255))
For PixelX=0 To width
For PixelY=0 To width
If Pixel(PixelX,PixelY+1)<>Pixel(PixelX,PixelY) Or Pixel(PixelX+1,PixelY)<>Pixel(PixelX,PixelY)
Plot(PixelX,PixelY,RGB(0,0,0))
Else
If Pixel(PixelX,PixelY)<51 ;rot-gelb
Plot(PixelX,PixelY,RGB(255,5*Pixel(PixelX,PixelY),0))
ElseIf Pixel(PixelX,PixelY)>50 And Pixel(PixelX,PixelY)<102 ;gelb-grün
Plot(PixelX,PixelY,RGB(255-5*(Pixel(PixelX,PixelY)-1*51),255,0))
ElseIf Pixel(PixelX,PixelY)>101 And Pixel(PixelX,PixelY)<153 ;grün-türkis
Plot(PixelX,PixelY,RGB(0,255,5*(Pixel(PixelX,PixelY)-2*51)))
ElseIf Pixel(PixelX,PixelY)>152 And Pixel(PixelX,PixelY)<204 ;türkis-blau
Plot(PixelX,PixelY,RGB(0,255-5*(Pixel(PixelX,PixelY)-3*51),255))
ElseIf Pixel(PixelX,PixelY)>203 And Pixel(PixelX,PixelY)<255 ;blau-violett
Plot(PixelX,PixelY,RGB(5*(Pixel(PixelX,PixelY)-4*51),0,255))
ElseIf Pixel(PixelX,PixelY)=255 ;weiß
Plot(PixelX,PixelY,RGB(255,255,255))
EndIf
EndIf
Next PixelY
Next PixelX
Else
Box(0,0,width,width,RGB(0,0,0))
For PixelX=0 To width
For PixelY=0 To width
If Pixel(PixelX,PixelY)<51 ;rot-gelb
Plot(PixelX,PixelY,RGB(255,5*Pixel(PixelX,PixelY),0))
ElseIf Pixel(PixelX,PixelY)>50 And Pixel(PixelX,PixelY)<102 ;gelb-grün
Plot(PixelX,PixelY,RGB(255-5*(Pixel(PixelX,PixelY)-1*51),255,0))
ElseIf Pixel(PixelX,PixelY)>101 And Pixel(PixelX,PixelY)<153 ;grün-türkis
Plot(PixelX,PixelY,RGB(0,255,5*(Pixel(PixelX,PixelY)-2*51)))
ElseIf Pixel(PixelX,PixelY)>152 And Pixel(PixelX,PixelY)<204 ;türkis-blau
Plot(PixelX,PixelY,RGB(0,255-5*(Pixel(PixelX,PixelY)-3*51),255))
ElseIf Pixel(PixelX,PixelY)>203 And Pixel(PixelX,PixelY)<255 ;blau-violett
Plot(PixelX,PixelY,RGB(5*(Pixel(PixelX,PixelY)-4*51),0,255))
ElseIf Pixel(PixelX,PixelY)=255 ;weiß
Plot(PixelX,PixelY,RGB(0,0,0))
EndIf
Next PixelY
Next PixelX
EndIf
StopDrawing()
StickyWindow(#showwindow,0)
CloseWindow(#showwindow)
WindowEvent()
SaveImage(#Bild,Save$,format)
Case 1
Save$=SaveFileRequester("Speichern unter","","Bild - Dateien|*."+en$,0)
If Save$<>""
If GetExtensionPart(Save$)<>en$
Save$+"."+en$
EndIf
SaveImage(#Fraktale_Bild,Save$,format)
EndIf
EndSelect
EndProcedure
Procedure TempImage(XStart.d,YStart.d,KX.d,KY.d,SVX.d,SVY.d,KL.d,Aeq,Group)
OpenPreferences("Fractal.prefs")
Select ReadPreferenceString("Auf","470 X 470")
Case "470 X 470"
auto=1
Case "512 X 512"
auto=0
width=512
Case "1024 X 1024"
auto=0
width=1024
EndSelect
ClosePreferences()
schrittweiteb.d=KL/width
Dim Pixel(width+1,width+1)
b.d=YStart
For PixelY=0 To width
a.d=XStart
For PixelX=0 To width
SVX.d=a
SVY.d=b
x.d=KX
y.d=KY
Versuche=0
Betrag.d=0
While ( Versuche < 255 And Betrag < 5 )
Versuche = Versuche + 1
Betrag = x*x + y*y
;Funktions-Beschreibung
Realanteil.d=x*x-y*y +SVX
Imaginaeranteil.d=2*x*y +SVY
x=Realanteil
y=Imaginaeranteil
Wend
Pixel(PixelX,PixelY) = Versuche
a = a + Schrittweiteb
Next PixelX
b = b + Schrittweiteb
Next PixelY
CreateImage(#Bild,width,width)
StartDrawing(ImageOutput(#Bild))
If Aeq=1
Box(0,0,width,width,RGB(255,255,255))
For PixelX=0 To width
For PixelY=0 To width
If Pixel(PixelX,PixelY+1)<>Pixel(PixelX,PixelY) Or Pixel(PixelX+1,PixelY)<>Pixel(PixelX,PixelY)
Plot(PixelX,PixelY,RGB(0,0,0))
Else
If Pixel(PixelX,PixelY)<51 ;rot-gelb
Plot(PixelX,PixelY,RGB(255,5*Pixel(PixelX,PixelY),0))
ElseIf Pixel(PixelX,PixelY)>50 And Pixel(PixelX,PixelY)<102 ;gelb-grün
Plot(PixelX,PixelY,RGB(255-5*(Pixel(PixelX,PixelY)-1*51),255,0))
ElseIf Pixel(PixelX,PixelY)>101 And Pixel(PixelX,PixelY)<153 ;grün-türkis
Plot(PixelX,PixelY,RGB(0,255,5*(Pixel(PixelX,PixelY)-2*51)))
ElseIf Pixel(PixelX,PixelY)>152 And Pixel(PixelX,PixelY)<204 ;türkis-blau
Plot(PixelX,PixelY,RGB(0,255-5*(Pixel(PixelX,PixelY)-3*51),255))
ElseIf Pixel(PixelX,PixelY)>203 And Pixel(PixelX,PixelY)<255 ;blau-violett
Plot(PixelX,PixelY,RGB(5*(Pixel(PixelX,PixelY)-4*51),0,255))
ElseIf Pixel(PixelX,PixelY)=255 ;weiß
Plot(PixelX,PixelY,RGB(255,255,255))
EndIf
EndIf
Next PixelY
Next PixelX
Else
Box(0,0,width,width,RGB(0,0,0))
For PixelX=0 To width
For PixelY=0 To width
If Pixel(PixelX,PixelY)<51 ;rot-gelb
Plot(PixelX,PixelY,RGB(255,5*Pixel(PixelX,PixelY),0))
ElseIf Pixel(PixelX,PixelY)>50 And Pixel(PixelX,PixelY)<102 ;gelb-grün
Plot(PixelX,PixelY,RGB(255-5*(Pixel(PixelX,PixelY)-1*51),255,0))
ElseIf Pixel(PixelX,PixelY)>101 And Pixel(PixelX,PixelY)<153 ;grün-türkis
Plot(PixelX,PixelY,RGB(0,255,5*(Pixel(PixelX,PixelY)-2*51)))
ElseIf Pixel(PixelX,PixelY)>152 And Pixel(PixelX,PixelY)<204 ;türkis-blau
Plot(PixelX,PixelY,RGB(0,255-5*(Pixel(PixelX,PixelY)-3*51),255))
ElseIf Pixel(PixelX,PixelY)>203 And Pixel(PixelX,PixelY)<255 ;blau-violett
Plot(PixelX,PixelY,RGB(5*(Pixel(PixelX,PixelY)-4*51),0,255))
ElseIf Pixel(PixelX,PixelY)=255 ;weiß
Plot(PixelX,PixelY,RGB(0,0,0))
EndIf
Next PixelY
Next PixelX
EndIf
StopDrawing()
SaveImage(#Bild,"Temp\"+Str(Group)+".bmp")
EndProcedure
;-HauptProgramm
CreateImage(#Fraktale_Bild,470,470)
CreateImage(#Fraktale_Copy,470,470)
CreateImage(#ToolBar_Image,16,16)
StartDrawing(ImageOutput(#ToolBar_Image))
b=-1.25
For PixelY=0 To 16
a=-1.7
For PixelX=0 To 16
SeedValueX=a
SeedValueY=b
x=0
y=0
n=0
Betrag=0
While ( n < 255 And Betrag < 5 )
n = n + 1
Betrag = x*x + y*y
Realanteil=x*x-y*y +SeedValueX
Imaginaeranteil=2*x*y +SeedValueY
x=Realanteil
y=Imaginaeranteil
Wend
If n<10
Plot(PixelX,PixelY,RGB(255,255,255))
Else
n=256-n
Plot(PixelX,PixelY,RGB(Sqr(n)*n+n*n,Log(n)*n,n))
EndIf
a = a + 5/32
Next PixelX
b = b + 5/32
Next PixelY
StopDrawing()
fy=50
fx=90
OpenWindow(#Fraktale_Fenster,0,0,630+fx,620+fy,"Apfelmännchen",#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget)
CreateGadgetList(WindowID(#Fraktale_Fenster))
;MausPosition:
mpox=485
mpoy=0+fy
Frame3DGadget(#Maus_Info,mpox,mpoy,140+fx,75,"Maus")
TextGadget(#X_Anzeige_Text,mpox+5,mpoy+20,15,20,"X :")
TextGadget(#X_Anzeige_Zahl,mpox+20,mpoy+17,110+fx,20,"/",#PB_Text_Border)
TextGadget(#Y_Anzeige_Text,mpox+5,mpoy+45,15,20,"Y :")
TextGadget(#Y_Anzeige_Zahl,mpox+20,mpoy+42,110+fx,20,"/",#PB_Text_Border)
;SeedValues
sevx=485
sevy=80+fy
Frame3DGadget(#SeedValue_Info,sevx,sevy,140+fx,105,"Konstanten")
TextGadget(#SeedValueX_Text,sevx+5,sevy+15,130+fx,20,"Konstante für X :")
StringGadget(#SeedValueX_Zahl,sevx+5,sevy+30,130+fx,20,StrD(KonstanteX))
TextGadget(#SeedValueY_Text,sevx+5,sevy+55,130+fx,20,"Konstante für Y :")
StringGadget(#SeedValueY_Zahl,sevx+5,sevy+70,130+fx,20,StrD(KonstanteY))
;Startwerte
stwx=485
stwy=190+fy
Frame3DGadget(#Startwerte,stwx,stwy,140,100,"Startwerte")
TextGadget(#X_Startwert_Text,stwx+5,stwy+15,130,20,"Startwert X :")
StringGadget(#X_Startwert_Zahl,stwx+5,stwy+30,130,20,StrD(X_Startwert))
TextGadget(#Y_Startwert_Text,stwx+5,stwy+55,130,20,"Startwert Y :")
StringGadget(#Y_Startwert_Zahl,stwx+5,stwy+70,130,20,StrD(Y_Startwert))
;Bild
frax=0
fray=0+fy
ImageGadget(#Fraktale_Gadget,frax,fray,470,470,ImageID(#Fraktale_Bild),#PB_Image_Border)
;Verlauf
CreateImage(#Verlauf_Bild,512,100)
StartDrawing(ImageOutput(#Verlauf_Bild))
n=0
Repeat
If n<51 ;rot-gelb
Box(2*n,0,2,100,RGB(255,5*n,0))
ElseIf n>50 And n<102 ;gelb-grün
Box(2*n,0,2,100,RGB(255-5*(n-1*51),255,0))
ElseIf n>101 And n<153 ;grün-türkis
Box(2*n,0,2,100,RGB(0,255,5*(n-2*51)))
ElseIf n>152 And n<204 ;türkis-blau
Box(2*n,0,2,100,RGB(0,255-5*(n-3*51),255))
ElseIf n>203 And n<255 ;blau-violett
Box(2*n,0,2,100,RGB(5*(n-4*51),0,255))
ElseIf n=255 ;schwarz
Box(2*n,0,2,100,RGB(0,0,0))
EndIf
n=n+1
Until n=256
verx=10
very=480+fy
StopDrawing()
ImageGadget(#Verlauf_Gadget,verx,very,512,100,ImageID(#Verlauf_Bild))
TextGadget(#Iterationszahl_Skala,verx,very+100,512,20,"Iterations-Tiefe: Niedrig Hoch")
;Buttons
stax=490
stay=300+fy
ButtonGadget(#Start,stax,stay,130+fx,50,"Berechnen")
AddKeyboardShortcut(#Fraktale_Fenster,#PB_Shortcut_Return,#Start)
;Iterationstiefe
itix=485
itiy=355+fy
Frame3DGadget(#Iterationstiefe_Info,itix,itiy,140+fx,120,"Iteratoinstiefe")
CreateImage(#Iterationstiefe_Farbe,127+fx,50)
ImageGadget(#Iterationstiefe_Gadget,itix+5,itiy+15,127+fx,50,ImageID(#Iterationstiefe_Farbe),#PB_Image_Border)
TextGadget(#Iterationstiefe_Text,itix+5,itiy+70,130+fx,20,"Iterationstiefe :")
TextGadget(#Iterationstiefe_Zahl,itix+5,itiy+90,130+fx,20,"",#PB_Text_Border)
;Zoom-Faktor
zfkx=635
zfky=190+fy
Frame3DGadget(#Zoom_Faktor_Info,zfkx,zfky,-10+fx,100,"Zoom")
TextGadget(#Zoom_Faktor_Text,zfkx+5,zfky+15,-20+fx,20,"Zoom-Faktor :")
StringGadget(#Zoom_Faktor_Zahl,zfkx+5,zfky+30,-20+fx,20,StrD(Zoomfaktor,3))
TextGadget(#Vergroesserung_Info,zfkx+5,zfky+50,-20+fx,20,"Vergrößerung :")
TextGadget(#Vergroesserung_Text,zfkx+5,zfky+70,-20+fx,20,StrD(Vergroesserung),#PB_Text_Border)
;ToolBar
CreateToolBar(#ToolBar_Bar,WindowID(#Fraktale_Fenster))
ToolBarStandardButton(#ToolBar_New,#PB_ToolBarIcon_New)
ToolBarToolTip(#ToolBar_Bar,#ToolBar_New,"Neu")
ToolBarStandardButton(#ToolBar_Open,#PB_ToolBarIcon_Open)
ToolBarToolTip(#ToolBar_Bar,#ToolBar_Open,"Bereits vorhandene Dateien öffnen")
ToolBarStandardButton(#ToolBar_Save,#PB_ToolBarIcon_Save)
ToolBarToolTip(#ToolBar_Bar,#ToolBar_Save,"Aktuelle Werte in Datei speichern")
ToolBarSeparator()
CreateImage(#Bitmap,16,16)
CopyImage(#ToolBar_Image,#Bitmap)
StartDrawing(ImageOutput(#Bitmap))
LineXY(1,3,5,3,RGB(255,0,0))
LineXY(5,3,5,1,RGB(255,0,0))
LineXY(5,1,9,5,RGB(255,0,0))
LineXY(9,5,5,9,RGB(255,0,0))
LineXY(5,9,5,7,RGB(255,0,0))
LineXY(5,7,1,7,RGB(255,0,0))
LineXY(1,7,1,3,RGB(255,0,0))
FillArea(2,4,RGB(255,0,0),RGB(230,230,150))
StopDrawing()
ToolBarImageButton(#ToolBar_Print_Datei,ImageID(#Bitmap))
ToolBarToolTip(#ToolBar_Bar,#ToolBar_Print_Datei,"Aktuelles Bild als Bitmap speichern")
ToolBarSeparator()
ToolBarImageButton(#ToolBar_Info,ImageID(#ToolBar_Image))
ToolBarToolTip(#ToolBar_Bar,#ToolBar_Info,"Info zum Programm")
;Menu
CreateMenu(#Menu,WindowID(#Fraktale_Fenster))
MenuTitle("&Datei")
MenuItem(#ToolBar_New,"&Neu"+Chr(9)+"Strg + N")
AddKeyboardShortcut(#Fraktale_Fenster,#PB_Shortcut_Control|#PB_Shortcut_N,#ToolBar_New)
MenuItem(#ToolBar_Open,"Ö&ffnen"+Chr(9)+"Strg + O")
AddKeyboardShortcut(#Fraktale_Fenster,#PB_Shortcut_Control|#PB_Shortcut_O,#ToolBar_Open)
MenuItem(#ToolBar_Save,"&Speichern"+Chr(9)+"Strg + S")
AddKeyboardShortcut(#Fraktale_Fenster,#PB_Shortcut_Control|#PB_Shortcut_S,#ToolBar_Save)
MenuBar()
MenuItem(#ToolBar_Print_Datei,"&Als Bitmap speichern"+Chr(9)+"Strg + B")
AddKeyboardShortcut(#Fraktale_Fenster,#PB_Shortcut_Control|#PB_Shortcut_B,#ToolBar_Print_Datei)
MenuBar()
MenuItem(69,"&Einstellungen")
MenuBar()
MenuItem(60,"&Beenden"+Chr(9)+"Alt + F4")
MenuTitle("&Beispiele")
OpenSubMenu("&Apfelmännchen - Fraktale")
MenuItem(61,"&Tal der Seepferdchen")
MenuItem(62,"&Doppelspirale")
MenuItem(63,"&Blitz")
MenuItem(64,"&Flammen")
CloseSubMenu()
MenuTitle("&Hilfe")
MenuItem(#ToolBar_Info,"&Info zum Programm"+Chr(9)+"F1")
AddKeyboardShortcut(#Fraktale_Fenster,#PB_Shortcut_F1,#ToolBar_Info)
MenuItem(68,"&Benutzung des Programms")
;Fraktal-Arten-Auswahl
faax=527
faay=483+fy
Frame3DGadget(#Aequipotentiallinien,faax,faay,98+fx,57,"Äquipotentiallinienstatus")
OptionGadget(#Nein,faax+3,faay+12,92+fx,20,"ausgeschaltet")
OptionGadget(#Ja,faax+3,faay+32,92+fx,20,"eingeschaltet")
SetGadgetState(#Nein,1)
If Parameter$<>""
If GetExtensionPart(Parameter$)="frac"
OpenPreferences(Parameter$)
X_Startwert=ReadPreferenceDouble("X_Startwert",-2.5):Y_Startwert=ReadPreferenceDouble("Y_Startwert",-2.5):KantenlaengeOriginal=ReadPreferenceDouble("KantenlaengeOriginal",5):KantenlaengePixel=ReadPreferenceDouble("KantenlaengePixel",470):Schrittweite=KantenlaengeOriginal/KantenlaengePixel:Vergroesserung=ReadPreferenceDouble("Vergroesserung",1):KonstanteX=ReadPreferenceDouble("KonstanteX",0):KonstanteY=ReadPreferenceDouble("KonstanteY",0):Aequipotentiallinien=ReadPreferenceDouble("Aequipotentiallinien",0):SeedValueX=ReadPreferenceDouble("SeedValueX",0):SeedValueY=ReadPreferenceDouble("SeedValueY",0)
ClosePreferences()
Berechne_Fraktale()
If Aequipotentiallinien=1
SetGadgetState(#Ja,1)
Else
SetGadgetState(#Nein,1)
EndIf
SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung)):SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert)):SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert)):SetGadgetState(#Fraktale_Gadget,ImageID(#Fraktale_Bild))
EndIf
Else
Berechne_Fraktale()
EndIf
Goto NewCursor
;-Ereignisschleife
Repeat
EventID=WaitWindowEvent()
Maus_X_aktuell=WindowMouseX(#Fraktale_Fenster)
Maus_Y_aktuell=WindowMouseY(#Fraktale_Fenster)-fy
Select EventID
Case #PB_Event_Gadget
Select EventGadget()
Case #Start
start:
Berechne_Fraktale()
SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung))
SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert))
SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert))
Goto NewCursor
Case #SeedValueX_Zahl
KonstanteX=ValD(GetGadgetText(#SeedValueX_Zahl))
Case #SeedValueY_Zahl
KonstanteY=ValD(GetGadgetText(#SeedValueY_Zahl))
Case #X_Startwert_Zahl
X_Startwert=ValD(GetGadgetText(#X_Startwert_Zahl))
Case #Y_Startwert_Zahl
Y_Startwert=ValD(GetGadgetText(#Y_Startwert_Zahl))
Case #Zoom_Faktor_Zahl
Zoomfaktor=ValD(GetGadgetText(#Zoom_Faktor_Zahl))
Goto NewCursor
Case #Ja
Aequipotentiallinien=1
StartDrawing(ImageOutput(#Fraktale_Bild))
Box(0,0,470,470,RGB(255,255,255))
For PixelX=0 To 470
For PixelY=0 To 470
If Iteration(PixelX,PixelY+1)<>Iteration(PixelX,PixelY) Or Iteration(PixelX+1,PixelY)<>Iteration(PixelX,PixelY)
Plot(PixelX,PixelY,RGB(0,0,0))
Else
If Iteration(PixelX,PixelY)<51 ;rot-gelb
Plot(PixelX,PixelY,RGB(255,5*Iteration(PixelX,PixelY),0))
ElseIf Iteration(PixelX,PixelY)>50 And Iteration(PixelX,PixelY)<102 ;gelb-grün
Plot(PixelX,PixelY,RGB(255-5*(Iteration(PixelX,PixelY)-1*51),255,0))
ElseIf Iteration(PixelX,PixelY)>101 And Iteration(PixelX,PixelY)<153 ;grün-türkis
Plot(PixelX,PixelY,RGB(0,255,5*(Iteration(PixelX,PixelY)-2*51)))
ElseIf Iteration(PixelX,PixelY)>152 And Iteration(PixelX,PixelY)<204 ;türkis-blau
Plot(PixelX,PixelY,RGB(0,255-5*(Iteration(PixelX,PixelY)-3*51),255))
ElseIf Iteration(PixelX,PixelY)>203 And Iteration(PixelX,PixelY)<255 ;blau-violett
Plot(PixelX,PixelY,RGB(5*(Iteration(PixelX,PixelY)-4*51),0,255))
ElseIf Iteration(PixelX,PixelY)=255 ;weiß
Plot(PixelX,PixelY,RGB(255,255,255))
EndIf
EndIf
Next PixelY
Next PixelX
StopDrawing()
Goto NewCursor
Case #Nein
Aequipotentiallinien=0
StartDrawing(ImageOutput(#Fraktale_Bild))
Box(0,0,470,470,RGB(0,0,0))
For PixelX=0 To 470
For PixelY=0 To 470
If Iteration(PixelX,PixelY)<51 ;rot-gelb
Plot(PixelX,PixelY,RGB(255,5*Iteration(PixelX,PixelY),0))
ElseIf Iteration(PixelX,PixelY)>50 And Iteration(PixelX,PixelY)<102 ;gelb-grün
Plot(PixelX,PixelY,RGB(255-5*(Iteration(PixelX,PixelY)-1*51),255,0))
ElseIf Iteration(PixelX,PixelY)>101 And Iteration(PixelX,PixelY)<153 ;grün-türkis
Plot(PixelX,PixelY,RGB(0,255,5*(Iteration(PixelX,PixelY)-2*51)))
ElseIf Iteration(PixelX,PixelY)>152 And Iteration(PixelX,PixelY)<204 ;türkis-blau
Plot(PixelX,PixelY,RGB(0,255-5*(Iteration(PixelX,PixelY)-3*51),255))
ElseIf Iteration(PixelX,PixelY)>203 And Iteration(PixelX,PixelY)<255 ;blau-violett
Plot(PixelX,PixelY,RGB(5*(Iteration(PixelX,PixelY)-4*51),0,255))
ElseIf Iteration(PixelX,PixelY)=255 ;weiß
Plot(PixelX,PixelY,RGB(0,0,0))
EndIf
Next PixelY
Next PixelX
StopDrawing()
Goto NewCursor
EndSelect
Case #PB_Event_CloseWindow
CloseWindow(#Fraktale_Fenster)
Break
Case #PB_Event_Menu
Select EventMenu()
Case #Start
Goto start
Case #ToolBar_New
If Movie=1
MessageRequester("Achtung!","Bitte schließen Sie zuerst die Animationsaufnahme!")
Else
KonstanteX=0
KonstanteY=0
X_Startwert=-2.5
Y_Startwert=-2.5
KantenlaengeOriginal=5
Schrittweite=KantenlaengeOriginal/KantenlaengePixel
Vergroesserung=1
Berechne_Fraktale():SetGadgetText(#SeedValueX_Zahl,StrD(KonstanteX)):SetGadgetText(#SeedValueY_Zahl,StrD(KonstanteY)):SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung)):SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert)):SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert)):Goto NewCursor
EndIf
Case #ToolBar_Open
If Movie=1
MessageRequester("Achtung!","Bitte schließen Sie zuerst die Animationsaufnahme!")
Else
Open$=OpenFileRequester("Öffnen","","Fraktal - Dateien (*.frac)|*.frac|Fraktal - Animationen (*.fmov)|*.fmov",0)
If Open$<>""
If GetExtensionPart(Open$)="frac"
OpenPreferences(Open$)
X_Startwert=ReadPreferenceDouble("X_Startwert",-2.5):Y_Startwert=ReadPreferenceDouble("Y_Startwert",-2.5):KantenlaengeOriginal=ReadPreferenceDouble("KantenlaengeOriginal",5):KantenlaengePixel=ReadPreferenceDouble("KantenlaengePixel",470):Schrittweite=KantenlaengeOriginal/KantenlaengePixel:Vergroesserung=ReadPreferenceDouble("Vergroesserung",1):KonstanteX=ReadPreferenceDouble("KonstanteX",0):KonstanteY=ReadPreferenceDouble("KonstanteY",0):Aequipotentiallinien=ReadPreferenceDouble("Aequipotentiallinien",0):SeedValueX=ReadPreferenceDouble("SeedValueX",0):SeedValueY=ReadPreferenceDouble("SeedValueY",0)
If KantenlaengeOriginal=0
KantenlaengeOriginal=5/Vergroesserung
Schrittweite=KantenlaengeOriginal/KantenlaengePixel
EndIf
ClosePreferences()
Berechne_Fraktale()
If Aequipotentiallinien=1
SetGadgetState(#Ja,1)
Else
SetGadgetState(#Nein,1)
EndIf
SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung)):SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert)):SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert)):Goto NewCursor
EndIf
EndIf
EndIf
Case #ToolBar_Save
Save$=SaveFileRequester("Speichern unter","","Fraktal - Dateien (*.frac)|*.frac",0)
If Save$<>""
If GetExtensionPart(Save$)<>"frac"
Save$+".frac"
EndIf
CreatePreferences(Save$)
WritePreferenceString("X_Startwert",StrD(X_Startwert,20))
WritePreferenceString("Y_Startwert",StrD(Y_Startwert,20))
WritePreferenceString("KantenlaengeOriginal",StrD(KantenlaengeOriginal,20))
WritePreferenceString("KantenlaengePixel",StrD(KantenlaengePixel,20))
WritePreferenceString("Vergroesserung",StrD(Vergroesserung,20))
WritePreferenceString("KonstanteX",StrD(KonstanteX,20))
WritePreferenceString("KonstanteY",StrD(KonstanteY,20))
WritePreferenceString("Aequipotentiallinien",StrD(Aequipotentiallinien,20))
WritePreferenceString("SeedValueX",StrD(SeedValueX,20))
WritePreferenceString("SeedValueY",StrD(SeedValueY,20))
ClosePreferences()
EndIf
Case #ToolBar_Print_Datei
SaveFractalImage(X_Startwert,Y_Startwert,KonstanteX,KonstanteY,SeedValueX,SeedValueY,KantenlaengeOriginal,Aequipotentiallinien)
Case #ToolBar_Info
MessageRequester("Info","Apfelmännchen v.1.0"+Chr(10)+"Programming:Olaf Leismann"+Chr(10)+"Date: 04.2006"+Chr(10)+"*.frac - Files v.1.0")
Case 61
If Movie=1
MessageRequester("Achtung!","Bitte schließen Sie zuerst die Animationsaufnahme!")
Else
X_Startwert=-0.755171
Y_Startwert=0.124949
KantenlaengeOriginal=5/216
Schrittweite=KantenlaengeOriginal/KantenlaengePixel
Vergroesserung=216
Berechne_Fraktale()
SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung))
SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert))
SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert))
Goto NewCursor
EndIf
Case 62
If Movie=1
MessageRequester("Achtung!","Bitte schließen Sie zuerst die Animationsaufnahme!")
Else
X_Startwert=-0.76477
Y_Startwert=-0.095514
KantenlaengeOriginal=5/3888
Schrittweite=KantenlaengeOriginal/KantenlaengePixel
Vergroesserung=3888
Berechne_Fraktale()
SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung))
SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert))
SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert))
Goto NewCursor
EndIf
Case 63
If Movie=1
MessageRequester("Achtung!","Bitte schließen Sie zuerst die Animationsaufnahme!")
Else
X_Startwert=-1.45
Y_Startwert=0.03
KantenlaengeOriginal=5/36
Schrittweite=KantenlaengeOriginal/KantenlaengePixel
Vergroesserung=36
Berechne_Fraktale()
SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung))
SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert))
SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert))
Goto NewCursor
EndIf
Case 64
If Movie=1
MessageRequester("Achtung!","Bitte schließen Sie zuerst die Animationsaufnahme!")
Else
X_Startwert=-0.967691
Y_Startwert=-0.338603
KantenlaengeOriginal=5/54
Schrittweite=KantenlaengeOriginal/KantenlaengePixel
Vergroesserung=54
Berechne_Fraktale()
SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung))
SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert))
SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert))
Goto NewCursor
EndIf
Case 60
If Movie=1
MessageRequester("Achtung!","Bitte schließen Sie zuerst die Animationsaufnahme!")
Else
CloseWindow(#Fraktale_Fenster)
Break
EndIf
Case 68
Benutzung:
MessageRequester("Hilfe","Kurzbeschreibung des Programms:"+Chr(10)+Chr(10)+"Mit diesem Programm können Apfelmännchen - Fraktale"+Chr(10)+"dargestellt, erstellt, gespeichert und abfotografiert"+Chr(10)+"werden (Bildgröße limitiert auf 470 X 470 Pixel)."+Chr(10)+Chr(10)+"Manchmal kann der Bildaufbau etwas Zeit in anspruch"+Chr(10)+"nehmen, da pro Bild teilweise einige Mrd. Rechnungen"+Chr(10)+"durchgeführt werden müssen."+Chr(10)+Chr(10)+"Bedienung:"+Chr(10)+Chr(10)+"Wenn Sie mit dem Cursor auf den gewünschten Bereich mit der"+Chr(10)+"linken Maustaste klicken, wird der Bereich um den gewünschten"+Chr(10)+"Zoom - Faktor vergrößert."+Chr(10)+"Wenn Sie das gleiche mit der rechten Maustaste machen,"+Chr(10)+"wird der aktuelle Bereich um den Zoom - Faktor verkleinert und"+Chr(10)+"es wird wieder ein größerer Bereich Sichtbar."+Chr(10)+Chr(10)+"Äquipotentiallinien:"+Chr(10)+Chr(10)+"eingechaltet: zwichen den unterschiedlichen Iterationstiefen"+Chr(10)+" werden Trennlinien (Äquipotentiallinien) angezeigt."+Chr(10)+"ausgeschaltet: es werden keine Äquipotentiallinien angezeigt."+Chr(10)+Chr(10)+"In allen anderen Feldern können Sie die Werte"+Chr(10)+"beliebig ändern (z.B. um zu sehen, was passiert)."+Chr(10)+Chr(10)+" Viel Spaß! :-)")
Case 69
OpenPreferenceWindow()
EndSelect
EndSelect
Select EventType()
Case #PB_EventType_LeftClick
If Maus_X_aktuell>0 And Maus_X_aktuell<KantenLaengePixel And Maus_Y_aktuell >0 And Maus_Y_aktuell <KantenlaengePixel
X_Startwert=X_Startwert+Schrittweite*(Maus_X_aktuell-KantenlaengePixel/2/Zoomfaktor)
Y_Startwert=Y_Startwert+Schrittweite*(Maus_Y_aktuell-KantenlaengePixel/2/Zoomfaktor)
KantenlaengeOriginal=Schrittweite*KantenlaengePixel/Zoomfaktor
Schrittweite=KantenlaengeOriginal/KantenlaengePixel
Vergroesserung=Vergroesserung*Zoomfaktor
Berechne_Fraktale()
SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung))
SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert))
SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert))
Goto NewCursor
EndIf
Case #PB_EventType_RightClick
If Maus_X_aktuell>0 And Maus_X_aktuell<KantenLaengePixel And Maus_Y_aktuell >0 And Maus_Y_aktuell <KantenlaengePixel
X_Startwert=X_Startwert+Schrittweite*(Maus_X_aktuell-KantenlaengePixel/2*Zoomfaktor)
Y_Startwert=Y_Startwert+Schrittweite*(Maus_Y_aktuell-KantenlaengePixel/2*Zoomfaktor)
KantenlaengeOriginal=Schrittweite*KantenlaengePixel*Zoomfaktor
Schrittweite=KantenlaengeOriginal/KantenlaengePixel
Vergroesserung=Vergroesserung/Zoomfaktor
Berechne_Fraktale()
SetGadgetText(#Vergroesserung_Text,StrD(Vergroesserung))
SetGadgetText(#X_Startwert_Zahl,StrD(X_Startwert))
SetGadgetText(#Y_Startwert_Zahl,StrD(Y_Startwert))
Goto NewCursor
EndIf
EndSelect
If Maus_X_aktuell <> Maus_X_vorher Or Maus_Y_aktuell <> Maus_Y_vorher
NewCursor:
If Maus_X_aktuell>0 And Maus_X_aktuell<KantenlaengePixel And Maus_Y_aktuell>0 And Maus_Y_aktuell < KantenlaengePixel
SetGadgetText(#X_Anzeige_Zahl, StrD(X_Startwert + Schrittweite * Maus_X_aktuell))
SetGadgetText(#Y_Anzeige_Zahl, StrD(-Y_Startwert - Schrittweite * Maus_Y_aktuell))
CopyImage(#Fraktale_Bild,#Fraktale_Copy)
If Aequipotentiallinien=1
boxcolor=RGB(128,128,128)
Else
boxcolor=RGB(255,255,255)
EndIf
StartDrawing(ImageOutput(#Fraktale_Copy))
DrawingMode(#PB_2DDrawing_Outlined)
Box(Maus_X_aktuell-235/Zoomfaktor,Maus_Y_aktuell-235/Zoomfaktor,470/Zoomfaktor,470/Zoomfaktor,boxcolor)
DrawingMode(#PB_2DDrawing_Default)
StopDrawing()
IterationDepth()
SetGadgetState(#Iterationstiefe_Gadget,ImageID(#Iterationstiefe_Farbe))
SetGadgetState(#Fraktale_Gadget,ImageID(#Fraktale_Copy))
Else
SetGadgetText(#X_Anzeige_Zahl, "/"):SetGadgetText(#Y_Anzeige_Zahl, "/"):StartDrawing(ImageOutput(#Iterationstiefe_Farbe))
Box(0,0,127+fx,50)
DrawingMode(1)
FrontColor(RGB(255,255,255))
DrawText(10,15,"Pointer outside Fractal Area")
StopDrawing()
SetGadgetState(#Iterationstiefe_Gadget,ImageID(#Iterationstiefe_Farbe))
SetGadgetText(#Iterationstiefe_Zahl,"/")
CopyImage(#Fraktale_Bild,#Fraktale_Copy)
SetGadgetState(#Fraktale_Gadget,ImageID(#Fraktale_Copy))
EndIf
Maus_X_vorher = Maus_X_aktuell
Maus_Y_vorher = Maus_Y_aktuell
EndIf
Delay(10)
ForEver