Mandelbrot und Julia [Neue Version!!]

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Nescio

Betreff: Mandelbrot und Julia [Neue Version!!]

BeitragDi, Okt 30, 2007 23:10
Antworten mit Zitat
Benutzer-Profile anzeigen
T-Masters Fraktale haben mich fasziniert und ich bin dann irgendwie auf Mandelbrot- und Juliamengen gestoßen.
Wikipedia:
- http://de.wikipedia.org/wiki/Mandelbrot-Menge
und
- http://de.wikipedia.org/wiki/Juliamenge
War auch von deren Aussehen fasziniert und hier ist das, was nach 2 Stunden (ich habe mich in der Schule noch NICHT mit komplexen Zahlen etc. befasst) rausgekommen ist:

Code: [AUSKLAPPEN]

Graphics 1024,768,0,2

xfact#=4.0/GraphicsWidth()
yfact#=-(4.0/GraphicsHeight())


c# = -1
ci#= 0

Global maxebene=20, col

cfact#=255.0/maxebene



   For X=0 To GraphicsWidth()
      For Y=0 To GraphicsHeight()
      
         F((X-(GraphicsWidth()/2))*xfact,(Y-(GraphicsHeight()/2))*yfact,c,ci)   ; Julia
      
         ;F(0,0,(X-(GraphicsWidth()/2))*xfact,(Y-(GraphicsHeight()/2))*yfact)      ; Mandelbrot
      
         Color 0,cfact*col,127-(cfact*col)/2
         Rect X,Y,1,1
   
         If KeyHit(1) Then End
      
      Next
   Next




WaitKey()

End





Function F(z#,zi#,c#,ci#,ebene=0)

   z1#=((z^2) - (zi^2)) + c
   zi1#= (2*z*zi) + ci
   
   ebene=ebene+1
   
   If Sqr#((z1#^2)+(zi1#^2)) >= 2 Or ebene=maxebene Then col=ebene : Return
   
   F(z1#,zi1#,c#,ci#,ebene)

End Function


Ich habe absichtlich BackBuffer() etc weggelassen, da es, zumindest bei mir, so wesentlich schneller läuft.

(Ich hoffe, der Code ist einigermaßen lesbar)

guckts euch an

MfG

Nescio


(achja, wer will darf sich gerne eine Zoom-funktion einbauen, lohnt sich!!)


EDIT:

habs grad selbst nochmal umgebaut:

Steuerung:

[M] - Zwischen Julia- und Mandelbrotmenge umschalten
pfeiltasten - mittelpunkt verschieben
[Q] und [A] - C ändern
[W] und [S] - CI ändern
[R] - alles auf Standard zurück setzen
[Numpad +] - Reinzoomen
[Numpad -] - Rauszoomen
[Leertaste] - Neu berechnen

Code: [AUSKLAPPEN]
Graphics 320,240,0,2

Global areax#=4.0   ; sichtbarer bereich
Global areay#=3.0

Global xfact#=areax#/GraphicsWidth()
Global yfact#=-(areay#/GraphicsHeight())

Global xshift#=0
Global yshift#=0

Global c# = 0
Global ci#=-1

Global maxebene=20, col

Global cfact#=255.0/maxebene

draw(menge)

Repeat

   change=0

   If KeyHit(200) Then
      yshift=yshift-(5+(20*KeyDown(54)))
      change=1
   EndIf
   
   If KeyHit(208) Then
      yshift=yshift+5+(20*KeyDown(54))
      change=1
   EndIf
   
   If KeyHit(203) Then
      xshift=xshift-(5+(20*KeyDown(54)))
      change=1
   EndIf
   
   If KeyHit(205) Then
      xshift=xshift+5+(20*KeyDown(54))
      change=1
   EndIf
   
   If KeyHit(74) Then
      areax=areax*1.1
      areay=areay*1.1
      xfact#=areax#/GraphicsWidth()
      yfact#=-(areay#/GraphicsHeight())
      
      xshift=xshift-(xshift*.1)
      yshift=yshift-(yshift*.1)
      
      change=1
   EndIf
   
   If KeyHit(78) Then
      areax=areax/1.1
      areay=areay/1.1
      xfact#=areax#/GraphicsWidth()
      yfact#=-(areay#/GraphicsHeight())
      
      xshift=xshift+(xshift*.1)
      yshift=yshift+(yshift*.1)
      change=1
   EndIf
   
   
   If KeyHit(50) Then
      menge=menge Xor 1
      change=1
   EndIf
   
   
   If KeyHit(16) Then
      c=c-.05
      If c<-1 Then c=-1
      change=1
   EndIf
   
   If KeyHit(30) Then
      c=c+.05
      If c>1 Then c=1
      change=1
   EndIf
   
   If KeyHit(17) Then
      ci=ci-.05
      If ci<-1 Then ci=-1
      change=1
   EndIf
   
   If KeyHit(31) Then
      ci=ci+.05
      If ci>1 Then ci=1
      change=1
   EndIf
   
   
   If KeyHit(19) Then
   
      c=-1
      ci=0
      
      areax=4
      areay=3
      xfact#=areax#/GraphicsWidth()
      yfact#=-(areay#/GraphicsHeight())
      
      xshift=0
      yshift=0
      
   EndIf
   
   If KeyHit(57) Then draw(menge)

Until KeyHit(1)





WaitKey()

End


Function draw(m)

   For X=-xshift To GraphicsWidth()-xshift
      For Y=-yshift To GraphicsHeight()-yshift
      
         If m=0 Then F((X-(GraphicsWidth()/2))*xfact,(Y-(GraphicsHeight()/2))*yfact,c,ci)   ; Julia
      
         If m=1 Then F(0,0,(X-(GraphicsWidth()/2))*xfact,(Y-(GraphicsHeight()/2))*yfact)      ; Mandelbrot
      
         Color cfact*col,(cfact*col)/1.75,0
         
         Rect X+xshift,Y+yshift,1,1
   
         If KeyHit(1) Then End
      
      Next
   Next
   
End Function


Function F(z#,zi#,c#,ci#,ebene=0)

   z1#=((z^2) - (zi^2)) + c
   zi1#= (2*z*zi) + ci
   
   ebene=ebene+1
   
   If Sqr#((z1#^2)+(zi1#^2)) >= 2 Or ebene=maxebene Then col=ebene : Return
   
   F(z1#,zi1#,c#,ci#,ebene)

End Function
   


Viel Spaß damit

MfG

Nescio[/b]
  • Zuletzt bearbeitet von Nescio am Sa, Nov 03, 2007 21:48, insgesamt einmal bearbeitet
 

Froggy

BeitragFr, Nov 02, 2007 20:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht echt geil aus!

Im Vergleich dazu sind andere Fraktale Kinderkram.
Ich verstehe die Bedeutung und Berechnung von diesen Fraktalen nicht, bin aber auch nicht sonderlich daran interessiert.

Einen Vorschlag hätte ich für deinen zweiten Code:

If KeyHit(57) Then draw(menge)

sollte folgendes werden:

If KeyHit(57) Or change=1 Then draw(menge)

Dann sieht man, was man verändert.

Nescio

BeitragFr, Nov 02, 2007 21:47
Antworten mit Zitat
Benutzer-Profile anzeigen
hatte ich zuerst so, aber da ich testhalber mal nah ranzoomen wollte hat es mich genervt, dass nach jedem zoomschritt neu gemalt wird (deshalb ist auch noch die Change Variable da...)

Nunja, zu den Berechnungen:
Jeder Pixel wird in eine komplexe Zahl zwischen -2 + -1,5i und 2 + 1,5i umgewandelt.
Danach wird die Funktion F aufgerufen, die das Quadrat davon berechnet und eine komplexe c +ci addiert.
Danach wird mit dieser neu errechneten Zahl wieder die funktion F aufgerufen.
Sobald der Betrag der komplexen Zahl >= 2 ist oder die maximale Anzahl der Wiederaufrufe erreicht ist, bricht das Wiederaufrufen ab und die Anzahl der Wiederaufrufungen wird zurück gegeben.
Aus dieser Zahl wird eine Farbe berechnet und der Pixel in der jeweiligen Farbe gefärbt (Hätte man evtl schneller machen können mit Read/Write Pixel...)

Nunja, ansonsten freut mich, dass es dir gefällt

MfG

Nescio
Quod est faciendum? Nescio!

Nescio

BeitragSa, Nov 03, 2007 21:48
Antworten mit Zitat
Benutzer-Profile anzeigen
Sorry für den Doppelpost, aber ich hoffe, es ist ok, da dass hier ein Update des Codes ist und nichts mit der vorgehender Erklärung zu tun hat...

Also denn, hier nun der (vorerst) endgültige Code:

Verbessert wurde das Zeichnen (WritePixelFast anstatt Rect) und die Zoom-Funktion (jetz mit Zoom-variable und nicht mehr zwei Ausschnittsvariablen)

So läuft das Programm nun wesentlich schneller und so wurde auch die Zeile
Code: [AUSKLAPPEN]
If Keyhit(57) Then Draw()

durch
Code: [AUSKLAPPEN]
If Keyhit(57) Or Change then Draw()

geändert, die Änderungen sind also sofort sichtbar.

Viel Spaß damit:

Code: [AUSKLAPPEN]
Graphics 320,240,0,2


Global zoom#=1.0

Global xshift#=0
Global yshift#=0

Global c# = 0
Global ci#=-1

Global maxebene=20, col

Global cfact#=255.0/maxebene

draw(menge)

Repeat

   change=0

   If KeyHit(200) Then
      yshift=yshift-(5+KeyDown(54)*20)
      change=1
   EndIf
   
   If KeyHit(208) Then
      yshift=yshift+(5+KeyDown(54)*20)
      change=1
   EndIf
   
   If KeyHit(203) Then
      xshift=xshift-(5+KeyDown(54)*20)
      change=1
   EndIf
   
   If KeyHit(205) Then
      xshift=xshift+(5+KeyDown(54)*20)
      change=1
   EndIf
   
   If KeyHit(74) Then
      zoom=zoom/.9
      
      change=1
   EndIf
   
   If KeyHit(78) Then
      zoom=zoom*.9
      
      change=1
   EndIf
   
   
   If KeyHit(50) Then
      menge=menge Xor 1
      change=1
   EndIf
   
   
   If KeyHit(16) Then
      c=c-.05
      If c<-1 Then c=-1
      change=1
   EndIf
   
   If KeyHit(30) Then
      c=c+.05
      If c>1 Then c=1
      change=1
   EndIf
   
   If KeyHit(17) Then
      ci=ci-.05
      If ci<-1 Then ci=-1
      change=1
   EndIf
   
   If KeyHit(31) Then
      ci=ci+.05
      If ci>1 Then ci=1
      change=1
   EndIf
   
   
   If KeyHit(19) Then
   
      c=-1
      ci=0
      
      zoom#=1.0
      
      xshift=0
      yshift=0
      
   EndIf
   
   If KeyHit(57) Or change Then draw(menge)

Until KeyHit(1)





WaitKey()

End


Function draw(m)
   
   
   fact#=zoom*4.0/GraphicsWidth()

   
   LockBuffer()
   
   For X=0 To GraphicsWidth()-1
      For Y=0 To GraphicsHeight()-1
         
         cx#=(X-(GraphicsWidth()/2+xshift/zoom) ) * fact      
         cy#=(Y-(GraphicsHeight()/2+yshift/zoom) ) * fact   
   
         If m=0 Then F(cx,cy,c,ci)      ; Julia
               
         If m=1 Then F(0,0,cx,cy)      ; Mandelbrot
         
         rgb=Int(cfact*col)*$100 + Int(128-cfact*col/2)
         
         WritePixelFast X,Y,RGB
         
         If KeyHit(1) Then End
      
      Next
   Next
   
   UnlockBuffer()
   
End Function


Function F(z#,zi#,c#,ci#,ebene=0)

   z1#=((z^2) - (zi^2)) + c
   zi1#= (2*z*zi) + ci
   
   ebene=ebene+1
   
   If Sqr#((z1#^2)+(zi1#^2)) >= 2 Or ebene=maxebene Then col=ebene : Return
   
   F(z1#,zi1#,c#,ci#,ebene)

End Function


MfG

Nescio
Quod est faciendum? Nescio!

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group