Drachenfraktal

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

TimBo

Betreff: Drachenfraktal

BeitragSa, Jun 27, 2009 18:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Heyho,

wofür man das benutzen, kann weiß ich nicht, aber ich Präsentiere hier stolz mein programmiertes

Drachenfraktal.

user posted image

Die Include Datei
Code: [AUSKLAPPEN]

;globals find_midpoints()
Global midx,midy

;Types
Type Linie
   Field x
   Field y
   Field x2
   Field y2
   Field status
End Type

Function find_midpoint(x1,y1,x2,y2,richtung)
   If i=handle_l Then
      winkel=(ATan2(y2-y1,x2-x1)+360) Mod 360
      laenge=Sqr( (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2) )
      
      x=x1+Cos(winkel)*laenge/2
      y=y1+Sin(winkel)*laenge/2
      
      winkel=winkel+richtung*90
      midx=x+Cos(winkel)*laenge/2
      midy=y+Sin(winkel)*laenge/2
      
      
   EndIf
   i=i+1
End Function


Function createfraktal(searchdeph,modi)
   richtung=-1
   While now<=searchdeph
      now=now+1   
      
      ;status 0=wird berechnet . 1=wird gelöscht . 2=wird später berechnet
      For l.linie=Each Linie ;fraktal wird erweitert
         
         If l\status=0
            find_midpoint(l\x,l\y,l\x2,l\y2,richtung)
            If modi=1 Then
               Select richtung
                  Case 1
                     richtung=-1
                  Case -1
                     richtung=1
               End Select
            EndIf
            ;^returns
            ;midx
            ;midy
            
            
            x=l\x
            y=l\y
            xx=l\x2
            yy=l\y2
            
            l\status=1
            
            xl.linie=New Linie
            xl\x=x
            xl\y=y
            xl\x2=midx
            xl\y2=midy
            xl\status=2
            
            xl.linie=New Linie
            xl\x=midx
            xl\y=midy
            xl\x2=xx
            xl\y2=yy
            xl\status=2
         EndIf
         If l\status=1 Then Delete l.linie   
      Next
      
      For l.linie=Each Linie
         If l\status=2 Then
            l\status=0
         EndIf
      Next
   Wend
End Function

Function renderfraktal()
                lockbuffer backbuffer()
   For l.linie=Each Linie
      Line l\x,l\y,l\x2,l\y2
   Next
                unlockbuffer backbuffer()
End Function

Function anzahl_linien()
   For l.linie=Each Linie
      a=a+1
   Next
   Return a
End Function

Function delete_lines()
   For l.Linie=Each Linie
      Delete l.linie
   Next
End Function

Function fraktal_coords(x1,y1,x2,y2)
   l.linie=New Linie
   l\x= x1
   l\y= y1
   l\x2=x2
   l\y2=y2
   l\status=0
End Function


Beispielprogramm:
Code: [AUSKLAPPEN]

Graphics 1024,768,32,2
SetBuffer BackBuffer()
timer=CreateTimer(60)

Include "fraktal_engine.bb"


;const main programm
Const keyx=44
Const keyy=45
Const keyspace=57
Const keyenter=28



;start settings
tmpx=300
tmpy=568
tmpx2=724
tmpy2=568
Local suchtiefe=10
Local startlinie=1

Repeat
   ms=MilliSecs()
   md1=MouseDown(1)
   md2=MouseDown(2)
   mx=MouseX()
   my=MouseY()
   
   If KeyHit(keyx) And suchtiefe>0 Then suchtiefe=suchtiefe-1
   If KeyHit(keyy) Then suchtiefe=suchtiefe+1
      
   If md1 Then
      tmpx=mx
      tmpy=my
   EndIf
   If md2 Then
      tmpx2=mx
      tmpy2=my
   EndIf
      
   delete_lines();löscht alle Linien, damit neu gerechnet werden kann
   fraktal_coords(tmpx,tmpy,tmpx2,tmpy2)
   If KeyHit(keyenter) modi=Not modi
   createfraktal(suchtiefe,modi)
   
   
   
   Color 255,255,255
   Text 0 ,0,MilliSecs()-ms
   Text 50,0," Millisekunden Rechenzeit"
   
   ms=MilliSecs()
   Color 200,200,200
   renderfraktal()
   Color 255,255,255
   
   If KeyHit(keyspace) startlinie=Not startlinie
   If startlinie Then
      Color 0,255,0
      Line tmpx,tmpy,tmpx2,tmpy2
      Color 255,255,255
   EndIf
            
   Text 0 ,20,MilliSecs()-ms
   Text 50,20," Millisekunden Renderzeit"
   
   
   Text 900, 0,"Tiefe "+suchtiefe
   Text 900,20,"Linien: "+anzahl_linien()
   
   ms=MilliSecs():Text 900,40,"FpS "+fps
   If ms>mt mt=ms+502:fps=frame:frame=0 Else frame=frame+2


   Flip(0):Cls
   ;WaitTimer(timer)
Until KeyHit(1)


Vielleicht könnt ihr mal eure Rechenzeiten des Fraktales durchgeben, das Render erfolgt ganz Primitiv mit Line

Features:
Arrow Linke Maustaste 1. Startpunkt verschieben
Arrow Rechte Maustaste 2. Startpunkt verschieben
Arrow Enter: Zwischen Drachenfraktal und dem nicht verwirbeltem Fraktal umschalten
Arrow Space: Startlinie Entfernen
Arrow X: Tiefe Erhöhen
Arrow Y: Tiefe Verkleinern

Ich hoffe es kann jemand was damit anfangen, wenn nicht (habe auch damit gerechnet Wink )

Edit: dies wurde mit einer Iteraktiven Lösung geschrieben, denn die Rekrusive braucht logischerweise mehr speicher.

Edit 2: die wenigen FPS auf dem Screenshot gehen auf das Screenshot tool, dank der Verbesserung durch Lockbuffer ist das noch um einiges schneller !!
Viele Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.
  • Zuletzt bearbeitet von TimBo am So, Jun 28, 2009 16:58, insgesamt 3-mal bearbeitet
 

Fredko

BeitragSa, Jun 27, 2009 19:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Sieht schön aus, in bunt und 3D wäre es wohl noch netter anzugucken und
vielleicht auch als Bildschirmschoner verwendbar Very Happy
An sich ist relativ schnell, aber füge mal bitte im Code in der Renderfunktion
Code: [AUSKLAPPEN]

LockBuffer Backbuffer()
...
UnlockBuffer Backbuffer()

( siehe line , damit dauert das Rendern kaum was )
ein.

Wie gesagt, schöne Spielerei, eine 3D Umsetzung wäre genial wegen
schneller Rotation usw. Very Happy
!

TimBo

BeitragSa, Jun 27, 2009 20:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

danke für das Feedbaq Very Happy

ich werde den Code einfügen. In 3D kann man das an sich auch machen einfach anstatt Lines objekte einfügen und dementsprechend ausrichten Smile

Da man leicht die Koordinaten verändern kann und da es Echtzeitfähig ist, könnte man das ja echt als Bildschirmschoner verwenden, habe daran noch gar nicht gedacht. ^^

Die Farben könnte man ja Anhand der Position der Linien zuordnen, so könnte man coole Farbübergänge herzaubern XD

Viele Grüße
TimBo
mfg Tim Borowski // CPU: Ryzen 2700x GPU: Nvidia RTX 2070 OC (Gigabyte) Ram: 16GB DDR4 @ 3000MHz OS: Windows 10
Stolzer Gewinner des BCC 25 & BCC 31
hat einen ersten Preis in der 1. Runde beim BWInf 2010/2011 & 2011/12 mit BlitzBasic erreicht.

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group