So, die
Galerie der Iteration fand ich so geil, das ich auch eine gemacht habe:
Hinweis: Langsammere Computer sollten die Größe der ausgabe (also #Size) irgendwo bei 100-200 legen, schnellere PCs können hoch geben auf 400. In allen Fällen aber Debugger ausschalten, da es sonst 4mal länger dauert!
Code: Alles auswählen
Enumeration
#Window : #Gadget : #Image : #Timer : #Button
EndEnumeration
; Größe der Ausgabe (Mal 3x2)
#Size = 250
Structure Complex
Re.f : Im.f
EndStructure
Procedure HSV(Hue.f, Saturation.f, Value.f)
Protected H = Int(Hue/60)
Protected f.f = (Hue/60-H)
Protected S.f = Saturation
Protected V.f = Value * 255
Protected p = V * (1-S)
Protected q = V * (1-S*f)
Protected t = V * (1-S*(1-f))
Select H
Case 1 : ProcedureReturn RGB(q,V,p)
Case 2 : ProcedureReturn RGB(p,V,t)
Case 3 : ProcedureReturn RGB(p,q,V)
Case 4 : ProcedureReturn RGB(t,p,V)
Case 5 : ProcedureReturn RGB(V,p,q)
Default : ProcedureReturn RGB(V,t,p)
EndSelect
EndProcedure
Procedure.d ComplexAngle(*Complex.Complex)
Protected Angle.f
With *Complex
Angle = ATan(\Im/\Re)
If \Re < 0 : Angle + #PI : ElseIf Angle < 0 : Angle + 2*#PI : EndIf
EndWith
ProcedureReturn Angle
EndProcedure
Global Dim Iteration.Complex(#Size*3, #Size*2)
Procedure CustomCallback(x, y, Color1, Color2)
Protected Add.Complex : Add\Re = x/#Size-2 : Add\Im = y/#Size-1
Protected Angle.f, Length.f, Darkness.f, Brightness.f, Temp.f
Protected *Value.Complex = @Iteration(x, y)
With *Value
Temp = \Re*\Re - \Im*\Im
\Im = 2*\Re*\Im + Add\Im
\Re = Temp + Add\Re
Length = Sqr(\Re*\Re+\Im*\Im)
Angle = ComplexAngle(*Value)*180/#PI
EndWith
If Length > 1e3 Or Length < 0
Darkness = 0 : Brightness = 1
ElseIf Length < 1
Darkness = 1 : Brightness = Sqr(Length)
Else
Darkness = 1/Length : Brightness = 1
EndIf
ProcedureReturn HSV(Angle, Brightness, Darkness)
EndProcedure
CreateImage(#Image, #Size*3, #Size*2)
OpenWindow(#Window, 0, 0, ImageWidth(#Image), ImageHeight(#Image)+20, "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#Gadget, 0, 20, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))
ButtonGadget(#Button, 0, 0, #Size*3, 20, "Nächte Iteration")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #Button
StartDrawing(ImageOutput(#Image))
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@CustomCallback())
Box(0, 0, #Size*3, #Size*2)
StopDrawing()
SetGadgetState(#Gadget, ImageID(#Image))
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
PS: wer keinen Regenbogen haben will (Farbe abhängige vom Winkel der komplexen Zahl) kann unten bei
ProcedureReturn HSV(Angle, Brightness, Darkness)
Angel duch einen beliebigen Winkel ersetzen (0=Rot, 120=Grün, 240=Blau), dann wäre es ein anderer Farbverlauf
______
Hier noch n Variante mit Julia-Mengen:
Code: Alles auswählen
Enumeration
#Window : #Gadget : #Image : #Timer : #Button
EndEnumeration
; Größe der Ausgabe (Mal 3x2)
#Size = 250
#ShiftRe = -0.8
#ShiftIm = 0.4
Structure Complex
Re.f : Im.f
EndStructure
Procedure HSV(Hue.f, Saturation.f, Value.f)
Protected H = Int(Hue/60)
Protected f.f = (Hue/60-H)
Protected S.f = Saturation
Protected V.f = Value * 255
Protected p = V * (1-S)
Protected q = V * (1-S*f)
Protected t = V * (1-S*(1-f))
Select H
Case 1 : ProcedureReturn RGB(q,V,p)
Case 2 : ProcedureReturn RGB(p,V,t)
Case 3 : ProcedureReturn RGB(p,q,V)
Case 4 : ProcedureReturn RGB(t,p,V)
Case 5 : ProcedureReturn RGB(V,p,q)
Default : ProcedureReturn RGB(V,t,p)
EndSelect
EndProcedure
Procedure.d ComplexAngle(*Complex.Complex)
Protected Angle.f
With *Complex
Angle = ATan(\Im/\Re)
If \Re < 0 : Angle + #PI : ElseIf Angle < 0 : Angle + 2*#PI : EndIf
EndWith
ProcedureReturn Angle
EndProcedure
Global Dim Iteration.Complex(#Size*3, #Size*2)
For x = 0 To #Size*3
For y = 0 To #Size*2
Iteration(x,y)\Im = y/#Size-1
Iteration(x,y)\Re = x/#Size-1.5
Next
Next
Procedure CustomCallback(x, y, Color1, Color2)
Protected Angle.f, Length.f, Darkness.f, Brightness.f, Temp.f
Protected *Value.Complex = @Iteration(x, y)
With *Value
Temp = \Re*\Re - \Im*\Im
\Im = 2*\Re*\Im + #ShiftIm
\Re = Temp + #ShiftRe
Length = Sqr(\Re*\Re+\Im*\Im)
Angle = ComplexAngle(*Value)*180/#PI
EndWith
If Length > 1e3 Or Length < 0
Darkness = 0 : Brightness = 1
ElseIf Length < 1
Darkness = 1 : Brightness = Sqr(Length)
Else
Darkness = 1/Sqr(Length) : Brightness = 1
EndIf
ProcedureReturn HSV(Angle, Brightness, Darkness)
EndProcedure
CreateImage(#Image, #Size*3, #Size*2)
OpenWindow(#Window, 0, 0, ImageWidth(#Image), ImageHeight(#Image)+20, "Image", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ImageGadget(#Gadget, 0, 20, ImageWidth(#Image), ImageHeight(#Image), ImageID(#Image))
ButtonGadget(#Button, 0, 0, #Size*3, 20, "Nächte Iteration")
Repeat
Event = WaitWindowEvent()
Select Event
Case #PB_Event_Gadget
Select EventGadget()
Case #Button
StartDrawing(ImageOutput(#Image))
DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_CustomFilter)
CustomFilterCallback(@CustomCallback())
Box(0, 0, #Size*3, #Size*2)
StopDrawing()
SetGadgetState(#Gadget, ImageID(#Image))
EndSelect
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
Hier könnt ihr oben
#ShiftRe = -0.8
#ShiftIm = 0.4
verändern, um so eine andere Juliamenge zu erzeugen