IFS-Generator

Spiele, Demos, Grafikzeug und anderes unterhaltendes.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

IFS-Generator

Beitrag von remi_meier »

Hi all
Hab mal wieder etwas mit Fraktalen rumgespielt und das ist dabei rausgekommen:

Code: Alles auswählen

sx = 500 ;GetSystemMetrics_(0) 
sy = 700 ;GetSystemMetrics_(1) 
 
InitSprite() 
InitKeyboard() 

Dim Sets.f(3, 5)
param.s = ProgramParameter()
If param = ""
  For x = 0 To 3
    For y = 0 To 5
      Sets(x, y) = (Random(1000) / 1000.0) - 0.5  ;(Random(2000) / 1000) - 1.0
    Next
  Next
  
Else ;Lade übergebenes File in Parameterliste Sets()
  OpenPreferences(param)
  For x = 0 To 3
    For y = 0 To 5
      Sets(x, y) = ReadPreferenceFloat(Str(x)+Str(y), 0.0)
    Next
  Next
  ClosePreferences()
EndIf

 
Global a.f, b.f, c.f, d.f, e.f, f.f
DefType.f x0,y0,z0,x1,y1,z1 
 
Global n, zoom
n  = 20000 
x0 = 0.1 
y0 = 0 
zoom = 100
 

Procedure EVENTS()
  Protected Name.s
  
  Select WindowEvent()
    Case 0
      Delay(10)
      
    Case #PB_Event_Gadget
      gadgetid = EventGadgetID()
      If gadgetid <= 6
        Sets(0, gadgetid - 1)  = (GetGadgetState(gadgetid) - 2000.0) / 1000.0
      ElseIf gadgetid <= 12
        Sets(1, gadgetid - 7)  = (GetGadgetState(gadgetid) - 2000.0) / 1000.0
      ElseIf gadgetid <= 18
        Sets(2, gadgetid - 13) = (GetGadgetState(gadgetid) - 2000.0) / 1000.0
      ElseIf gadgetid <= 24
        Sets(3, gadgetid - 19) = (GetGadgetState(gadgetid) - 2000.0) / 1000.0
        
      ElseIf gadgetid = 25 ;Iterationen
        n = GetGadgetState(gadgetid) * 10
        
      ElseIf gadgetid = 26 ;zoom
        zoom = GetGadgetState(gadgetid)
        
      ElseIf gadgetid = 27 ;{speichern
        Name.s = "IFS-FILE"
        While FileSize(Name + ".ifs") <> -1
          Name = "Neu " + Name
        Wend
        Name + ".ifs"
        
        CreatePreferences(Name)
        For x = 0 To 3
          For y = 0 To 5
            WritePreferenceFloat(Str(x)+Str(y), Sets(x, y))
          Next
        Next
        ClosePreferences();}
      EndIf
      
    Case #PB_Event_CloseWindow
      End
  EndSelect
EndProcedure


If OpenWindow(0, 200, 700, 800, 700, #PB_Window_ScreenCentered|#PB_Window_SystemMenu, "IFS-Generator") And OpenWindowedScreen(WindowID(),200,0,sx,sy,1,0,0) 
  If CreateGadgetList(WindowID()) ;{
    TrackBarGadget(1, 5, 5, 190,15, 0, 4000)
    SetGadgetState(1, Sets(0, 0) * 1000.0 + 2000)
    TrackBarGadget(2, 5,25, 190,15, 0, 4000)
    SetGadgetState(2, Sets(0, 1) * 1000.0 + 2000)
    TrackBarGadget(3, 5,45, 190,15, 0, 4000)
    SetGadgetState(3, Sets(0, 2) * 1000.0 + 2000)
    TrackBarGadget(4, 5,65, 190,15, 0, 4000)
    SetGadgetState(4, Sets(0, 3) * 1000.0 + 2000)
    TrackBarGadget(5, 5,85, 190,15, 0, 4000)
    SetGadgetState(5, Sets(0, 4) * 1000.0 + 2000)
    TrackBarGadget(6, 5,105, 190,15, 0, 4000)
    SetGadgetState(6, Sets(0, 5) * 1000.0 + 2000)
    
    TrackBarGadget(7, 5,125, 190,15, 0, 4000)
    SetGadgetState(7, Sets(1, 0) * 1000.0 + 2000)
    TrackBarGadget(8, 5,145, 190,15, 0, 4000)
    SetGadgetState(8, Sets(1, 1) * 1000.0 + 2000)
    TrackBarGadget(9, 5,165, 190,15, 0, 4000)
    SetGadgetState(9, Sets(1, 2) * 1000.0 + 2000)
    TrackBarGadget(10, 5,185, 190,15, 0, 4000)
    SetGadgetState(10, Sets(1, 3) * 1000.0 + 2000)
    TrackBarGadget(11, 5,205, 190,15, 0, 4000)
    SetGadgetState(11, Sets(1, 4) * 1000.0 + 2000)
    TrackBarGadget(12, 5,225, 190,15, 0, 4000)
    SetGadgetState(12, Sets(1, 5) * 1000.0 + 2000)
    
    TrackBarGadget(13, 5,245, 190,15, 0, 4000)
    SetGadgetState(13, Sets(2, 0) * 1000.0 + 2000)
    TrackBarGadget(14, 5,265, 190,15, 0, 4000)
    SetGadgetState(14, Sets(2, 1) * 1000.0 + 2000)
    TrackBarGadget(15, 5,285, 190,15, 0, 4000)
    SetGadgetState(15, Sets(2, 2) * 1000.0 + 2000)
    TrackBarGadget(16, 5,305, 190,15, 0, 4000)
    SetGadgetState(16, Sets(2, 3) * 1000.0 + 2000)
    TrackBarGadget(17, 5,325, 190,15, 0, 4000)
    SetGadgetState(17, Sets(2, 4) * 1000.0 + 2000)
    TrackBarGadget(18, 5,345, 190,15, 0, 4000)
    SetGadgetState(18, Sets(2, 5) * 1000.0 + 2000)
    
    TrackBarGadget(19, 5,365, 190,15, 0, 4000)
    SetGadgetState(19, Sets(3, 0) * 1000.0 + 2000)
    TrackBarGadget(20, 5,385, 190,15, 0, 4000)
    SetGadgetState(20, Sets(3, 1) * 1000.0 + 2000)
    TrackBarGadget(21, 5,405, 190,15, 0, 4000)
    SetGadgetState(21, Sets(3, 2) * 1000.0 + 2000)
    TrackBarGadget(22, 5,425, 190,15, 0, 4000)
    SetGadgetState(22, Sets(3, 3) * 1000.0 + 2000)
    TrackBarGadget(23, 5,445, 190,15, 0, 4000)
    SetGadgetState(23, Sets(3, 4) * 1000.0 + 2000)
    TrackBarGadget(24, 5,465, 190,15, 0, 4000)
    SetGadgetState(24, Sets(3, 5) * 1000.0 + 2000)
    
    TrackBarGadget(25, 5,500, 190,15, 0, 10000)
    SetGadgetState(25, n / 10)
    
    TrackBarGadget(26, 5,530, 190,15, 0, 1000)
    SetGadgetState(26, zoom) 
    
    ButtonGadget(27, 5, 560, 60, 25, "Speichern")
    ;}
  EndIf
  
  Repeat 
    ExamineKeyboard() 
    
    ClearScreen(0,0,0) 
    
    StartDrawing(ScreenOutput())
    For i=0 To n-1 
      x1 = a * x0 + b * y0 + c 
      y1 = d * x0 + e * y0 + f 
      
      k = Random(3)
      a.f = Sets(k, 0)
      b.f = Sets(k, 1)
      c.f = Sets(k, 2)
      d.f = Sets(k, 3)
      e.f = Sets(k, 4)
      f.f = Sets(k, 5)
      
      x0 = x1
      y0 = y1 
      
      xp = x0 * zoom + Round(sx/2,1) 
      yp = y0 * zoom + Round(sy/2,1) 
      If (i > 100) And xp > 0 And xp < sx And yp > 0 And yp < sy 
        color = i / 100 * 16777000
        FrontColor(Red(color), Green(color), Blue(color))
        Plot(xp, yp)
      EndIf 
    Next 
    StopDrawing() 
    
    If KeyboardPushed(#PB_Key_F1) 
      sp = GrabSprite(#PB_Any, 0, 0, sx, sy)
      SaveSprite(sp, "Screenshot.bmp")
      FreeSprite(sp)
    EndIf 
    
    EVENTS()
    FlipBuffers() 
  Until KeyboardPushed(1) 
  CloseScreen() 
  
Else 
  MessageRequester("Error","Can't open screen",0) 
EndIf 
Zum Thema:
http://de.wikipedia.org/wiki/Iteriertes ... nen-System
Spielt einfach ein bisschen damit rum und wenn ihr etwas tolles gefunden habt, ladet doch einfach die .ifs - Datei hoch (oder kopiert den Inhalt hier rein...)!

greetz
remi
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

naja, also irgentwie ne beschriftung der schieberegler,
und ne grundsätzliche beschreibung,
was da eigentlich dargestellt wird und was da abläuft,
hättest du uns schon gönnen können :wink:
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
remi_meier
Beiträge: 1078
Registriert: 29.08.2004 20:11
Wohnort: Schweiz

Beitrag von remi_meier »

Nagot:
Also grundsätzlich zeichnet es ja Punkte durch wiederholtes ausführen dieser Formel:

Code: Alles auswählen

x1 = a * x0 + b * y0 + c 
y1 = d * x0 + e * y0 + f
Das ganze ist iterativ, d.h. es verwendet die vorherigen x/y-Koordinaten um durch die Formel (s.o.) die neuen zu berechnen.
Nun gibts da noch halbwegs konstante Parameter (a, b, c, d, e, f). Es gibt aber 4 Tabellen von diesen Parametern, also 4 Sets von diesen 6 Parametern (Sets() - Array). Bei jeder Iteration wird nun wieder per Zufall eines dieser 4 Sets ausgewählt und die Parameter nach diesen geändert:

Code: Alles auswählen

 k = Random(3) 
      a.f = Sets(k, 0) 
      b.f = Sets(k, 1) 
      c.f = Sets(k, 2) 
      d.f = Sets(k, 3) 
      e.f = Sets(k, 4) 
      f.f = Sets(k, 5)
Nun kommt es v. a. auf die Parametersets drauf an, welche Formen entstehen und deshalb gibt es diese vielen Schieberegler.

Beschreibung der Oberfläche:
- 4 * 6 Schieberegler um die Sets (od. Parameter) zu ändern.
Die letzten 2 Regler:
- Anzahl Iterationen, d.h. wieviele Punkte gezeichnet werden sollen (mehr -> langsamer)
- Zoom: ganz einfaches Vergrössern des Bildes
Button "Speichern"
Dieser Button speichert die Parameter (Sets) in einer .ifs Datei im Programmverzeichnis, die durch einfaches ziehen auf die EXE des Programms wieder geladen werden kann.

Wenn ich noch mehr Zeit finde, erkläre ich es vielleicht noch ausführlicher (dann würde es schon wieder zu Tipps und Tricks gehören...), es sollte ja nur ein bisschen zum Rumspielen sein...

greetz
remi :)
Antworten