Mandelbrot und Julia [Neue Version!!]
Übersicht

![]() |
NescioBetreff: Mandelbrot und Julia [Neue Version!!] |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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! |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group