Fraktale: Das Sierpinski-Dreieck

    • VB6

    Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von ThePlexian.

      Fraktale: Das Sierpinski-Dreieck

      Folgender Code zeichnet ein Sierpinski-Dreieck bis
      zur achten Iterationsstufe. Controls werden nicht
      benötigt:

      Visual Basic-Quellcode

      1. ' Sierpinski-Dreieck
      2. ' Copyright © 2012 by Neptun
      3. Option Explicit
      4. Private Type POINTAPI
      5. x As Long
      6. y As Long
      7. End Type
      8. Private Type PtSng
      9. x As Single
      10. y As Single
      11. End Type
      12. Private Type Triple
      13. PtList(2) As PtSng
      14. End Type
      15. Private Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
      16. Private Triangle1() As Triple
      17. Private Stage&
      18. Private Sub Form_Load()
      19. ' Einstellungen Form
      20. With Me
      21. .ScaleMode = vbPixels
      22. .Caption = "Sierpinski-Dreieck"
      23. .WindowState = vbMaximized
      24. .KeyPreview = True
      25. End With
      26. End Sub
      27. Private Sub Form_Activate()
      28. ' Stufe abfragen
      29. Stage = Val(InputBox("Iterationsstufe? (0 - 8)", Me.Caption, 6))
      30. Me.MousePointer = vbHourglass
      31. ' Stufe begrenzen
      32. If Stage < 0 Then
      33. Stage = 0
      34. ElseIf Stage > 8 Then
      35. Stage = 8
      36. End If
      37. Call CalcTriangle ' Rechnen
      38. Call DrawTriangle ' Zeichnen
      39. Me.MousePointer = vbDefault
      40. End Sub
      41. Private Sub CalcTriangle()
      42. ' Dreiecke berechnen
      43. Dim i&, j&, k&, IT&, g&
      44. Dim S!, Rand!, SW!, SH!, XP!, YP!
      45. Dim Triangle2() As Triple
      46. Rand = 8 ' Randabstand
      47. SW = Me.ScaleWidth
      48. SH = Me.ScaleHeight
      49. S = (SH - 2 * Rand) / Sqr(3)
      50. ReDim Triangle1(0)
      51. ' 1. Dreieck belegen
      52. For i = 0 To 2
      53. With Triangle1(0).PtList(i)
      54. .x = SW / 2 + Choose(i + 1, 0, -S, S)
      55. .y = IIf(i = 0, Rand, SH - Rand)
      56. End With
      57. Next i
      58. ' Alle Iterations-Stufen durchlaufen
      59. For IT = 1 To Stage
      60. ' Arrays anlegen
      61. g = UBound(Triangle1)
      62. ReDim Triangle2(g)
      63. Triangle2 = Triangle1
      64. ReDim Triangle1((g + 1) * 3 - 1)
      65. ' Dreiecke berechnen und eintragen
      66. For i = 0 To g
      67. For j = 0 To 2
      68. With Triangle1(3 * i + j)
      69. For k = 0 To 2
      70. With Triangle2(i)
      71. XP = .PtList(j).x
      72. YP = .PtList(j).y
      73. If k > 0 Then
      74. With .PtList((j + k) Mod 3)
      75. XP = (XP + .x) / 2
      76. YP = (YP + .y) / 2
      77. End With
      78. End If
      79. End With
      80. With .PtList(k)
      81. .x = XP
      82. .y = YP
      83. End With
      84. Next k
      85. End With
      86. Next j
      87. Next i
      88. Next IT
      89. ' Speicher freigeben
      90. Erase Triangle2
      91. End Sub
      92. Private Sub DrawTriangle()
      93. ' Dreiecke zeichnen
      94. Dim i&, j&, Figur(2) As POINTAPI
      95. With Me
      96. .Caption = .Caption & Space$(10) & "Stufe " & Stage
      97. .BackColor = vbWhite ' Hintergrundfarbe
      98. .ForeColor = vbRed ' Kantenfarbe Dreiecke
      99. .FillColor = vbRed ' Füllfarbe Dreiecke
      100. .FillStyle = vbFSSolid
      101. .AutoRedraw = True
      102. .Cls
      103. ' Alle Dreiecke durchgehen
      104. For i = 0 To UBound(Triangle1)
      105. ' Eckpunkte übertragen
      106. For j = 0 To 2
      107. With Triangle1(i).PtList(j)
      108. Figur(j).x = .x
      109. Figur(j).y = .y
      110. End With
      111. Next j
      112. ' Dreieck zeichnen
      113. Call Polygon(.hdc, Figur(0), 3)
      114. Next i
      115. .FillStyle = vbFSTransparent
      116. End With
      117. End Sub
      118. Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
      119. ' Beenden
      120. If KeyCode = vbKeyEscape Then Unload Me
      121. End Sub
      Bilder
      • DREIECK2.JPG

        53,8 kB, 819×710, 329 mal angesehen
      Gruss,

      Neptun

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Neptun“ ()

      Hallo,

      Der Coode ist wircklich Kunst des Programmierens aber mal ne kleine Frage am Rande falls erlaubt? Kann ich die Größe und die Richtung des Dreicks so wie die farben der Inneren Dreiecke auch Vaiieren??

      LG, Herbrich
      In den Tipps&Tricks und im Sourcecode-Austauschist's erlaubt, sofern es Erweiterungen gibt, in allen Bereichen, wenn es weitere Fragen zu einem expliziten Thema gibt.
      Der Code ist in .Net trivial umzusetzen: Bis zu einem gewissen Grad einfach ein gleichseitiges Dreieck in vier Dreiecke zerlegen (Tipp: höhe/2, breite/2 sind zwei wichtige Orte) und dieses dann über die Eckpunkte darstellen.

      Gruß
      ~blaze~
      @~blaze~ : Ich hab sowas mal implementiert, und dabei das Lindenmayer-System genutzt, geht mathematisch gesehen einfacher, da so gleich mehrere Fraktale abgebildet werden können ^^
      »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais