Kochkurve - ein Fraktal alten Ranges!

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

 

Darren

Betreff: Kochkurve - ein Fraktal alten Ranges!

BeitragDi, Feb 17, 2009 16:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Guten Tag!

Ich bin grade dabei mich ein wenig mit der Arbeit von Mandelbrot zu beschäftigen, und habe mal gestern und heute den code für eine Kochkurve eingehackt. Man muss zweimal ins bild klicken. Mit der Gerade, die von den beiden Punkten festgelegt wird, wird ein gleichseitiges Dreieck konstruiert und das dan als Generator benutzt.

Iterator ist wie bei der normalen Kochkurve normal das gleichseitige Dreieck über dem mittleren Drittel. Was eine Fraktale Dimension von log(4)/log(3) ergibt. Laughing

Code: [AUSKLAPPEN]
;kochkurve.bb
Type r2_vec ;richtungen mit prefix d_, positionen mit l_
   Field x1#
   Field x2#
End Type

Type r2_line
   Field l_a.r2_vec
   Field l_b.r2_vec
   Field d_v.r2_vec ;normalisiert
   Field length#
   Field angle#
End Type

Type seite
   Field linie.r2_line[3]
   Field schritt
End Type

Graphics 800,600,16,2
SetBuffer BackBuffer()

Local pkt1.r2_vec
Local pkt2.r2_vec
Local strich.r2_line
Local draw_p.r2_vec
Local draw_l.r2_line

Local iterationen = Input("Iterationen: ")
Local inverse = Input("Invert Fraktal? - 0 = No; 1 = Yes: ")
Local i = 0,j = 0
Local erstellt = 0
Global koeffizient_h# = 0.5 * Sqr(3)
Local spitze.r2_vec


Local kante.seite
Local kante_neu.seite

While Not KeyHit(1)
   Cls
   If MouseHit(1) And erstellt = 0 Then
      If pkt1 = Null Then
         pkt1 = New r2_vec
         pkt1\x1 = MouseX()
         pkt1\x2 = MouseY()
      Else
         pkt2 = New r2_vec
         pkt2\x1 = MouseX()
         pkt2\x2 = MouseY()
         erstellt = 1
      End If
      If erstellt = 1 Then
         spitze = create_tris(pkt1,pkt2)
         kante = New seite
         kante\linie[0] = New r2_line
         kante\linie[0]\l_a = pkt1
         kante\linie[0]\l_b = pkt2
         kante\linie[1] = New r2_line
         kante\linie[1]\l_a = pkt2
         kante\linie[1]\l_b = spitze
         kante\linie[2] = New r2_line
         kante\linie[2]\l_a = spitze
         kante\linie[2]\l_b = pkt1
         kante\linie[3] = New r2_line
         kante\linie[3]\l_a = New r2_vec
         kante\linie[3]\l_a\x1 = 0
         kante\linie[3]\l_a\x2 = 0
         kante\linie[3]\l_b = New r2_vec
         kante\linie[3]\l_b\x1 = 0
         kante\linie[3]\l_b\x2 = 0
         Local p1.r2_vec
         Local p2.r2_vec
         For i = 0 To iterationen
            For kante = Each seite
               For j = 0 To 3
                  p1.r2_vec = divide_line(kante\linie[j],0.33333)
                  p2.r2_vec = divide_line(kante\linie[j],0.66666)
                  If inverse = 1 Then
                     spitze = create_tris(p1,p2)
                  Else
                     spitze = create_tris(p2,p1)
                  End If
                  kante_neu = New seite
                  Insert kante_neu Before First seite
                  kante_neu\linie[0] = New r2_line
                  kante_neu\linie[1] = New r2_line
                  kante_neu\linie[2] = New r2_line
                  kante_neu\linie[3] = New r2_line
                  kante_neu\linie[0]\l_a = kante\linie[j]\l_a
                  kante_neu\linie[0]\l_b = p1
                  kante_neu\linie[1]\l_a = p1
                  kante_neu\linie[1]\l_b = spitze
                  kante_neu\linie[2]\l_a = spitze
                  kante_neu\linie[2]\l_b = p2
                  kante_neu\linie[3]\l_a = p2
                  kante_neu\linie[3]\l_b = kante\linie[j]\l_b
                  Delete kante\linie[j]
               Next
               Delete kante
            Next
         Next
      End If
      
   End If
   
   For draw_p = Each r2_vec
      ;Line draw_p\x1-2,draw_p\x2-2,draw_p\x1+2,draw_p\x2+2
      ;Line draw_p\x1+2,draw_p\x2-2,draw_p\x1-2,draw_p\x2+2
   Next
   For draw_l = Each r2_line
      Line draw_l\l_a\x1,draw_l\l_a\x2,draw_l\l_b\x1,draw_l\l_b\x2
   Next
   
   Text 10,10, "iterationen:" + iterationen
   
   Flip
   ;FlushKeys()
   ;FlushMouse()
Wend
End

Function divide_line.r2_vec(l.r2_line,t#);t = prozentual auf der linie
   Local t1_x1#,t1_x2#
   Local laenge# = Sqr((l\l_a\x1-l\l_b\x1)^2 + (l\l_a\x2-l\l_b\x2)^2)
   Local d_x1#,d_x2#
   d_x1 = (l\l_a\x1 - l\l_b\x1)/laenge
   d_x2 = (l\l_a\x2 - l\l_b\x2)/laenge
   t1_x1 = l\l_a\x1 - t*laenge*d_x1
   t1_x2 = l\l_a\x2 - t*laenge*d_x2
   Local t1.r2_vec = New r2_vec
   t1\x1 = t1_x1
   t1\x2 = t1_x2
   Return t1
End Function

Function create_tris.r2_vec(p1.r2_vec,p2.r2_vec)
   Local m_x1#,m_x2#
   m_x1 = (p1\x1 + p2\x1)/2
   m_x2 = (p1\x2 + p2\x2)/2
   Local laenge = Sqr((p1\x1 - p2\x1)^2 + (p1\x2 - p2\x2)^2)
   Local hoehe_length = laenge * koeffizient_h
   Local d_x1#,d_x2#
   d_x1 = (p2\x2 - p1\x2)/laenge
   d_x2 = (-p2\x1 + p1\x1)/laenge
   Local peak_x1# = m_x1 + d_x1 * hoehe_length
   Local peak_x2# = m_x2 + d_x2 * hoehe_length
   Local peak.r2_vec = New r2_vec
   peak\x1 = peak_x1
   peak\x2 = peak_x2
   Return peak
End Function
MFG Darren

Firstdeathmaker

BeitragDi, Feb 17, 2009 17:30
Antworten mit Zitat
Benutzer-Profile anzeigen
4 iterationen gehen bei mir noch problemlos, bei 5 gibt es leider grafikfehler (die lines gehen alle zum oberen linken Bildschirmrand). Sonst ne nette Spielerei Wink
www.illusion-games.de
Space War 3 | Space Race | Galaxy on Fire | Razoon
Gewinner des BCC #57 User posted image

Chrise

BeitragMi, Feb 18, 2009 20:55
Antworten mit Zitat
Benutzer-Profile anzeigen
So ist Mathematik doch immer wieder was schönes Smile
Ich finds sehr gut gelungen.

Triton

BeitragFr, Feb 20, 2009 13:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hab gerade nur mein Notebook. Und hier passiert nach eingabe der Daten nichts.
Coding: silizium-net.de | Portfolio: Triton.ch.vu
 

Darren

BeitragFr, Feb 20, 2009 16:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@Triton:
ja du musst noch mit zwei mausklicks eine seite des gleichseitigen dreiecks festlegen!
MFG Darren

Triton

BeitragSo, Feb 22, 2009 2:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Ach bin ich doof.

Jaja, lesen-können ist von vorteil Rolling Eyes Smile


Abgesehen davon wird die Darstellung auch bei mir ab 5 Stufen fehlerhaft.
Coding: silizium-net.de | Portfolio: Triton.ch.vu

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group