Folgender Code zeichnet ein Sierpinski-Dreieck bis
zur achten Iterationsstufe. Controls werden nicht
benötigt:
zur achten Iterationsstufe. Controls werden nicht
benötigt:
Visual Basic-Quellcode
- ' Sierpinski-Dreieck
- ' Copyright © 2012 by Neptun
- Option Explicit
- Private Type POINTAPI
- x As Long
- y As Long
- End Type
- Private Type PtSng
- x As Single
- y As Single
- End Type
- Private Type Triple
- PtList(2) As PtSng
- End Type
- Private Declare Function Polygon Lib "gdi32" (ByVal hdc As Long, lpPoint As POINTAPI, ByVal nCount As Long) As Long
- Private Triangle1() As Triple
- Private Stage&
- Private Sub Form_Load()
- ' Einstellungen Form
- With Me
- .ScaleMode = vbPixels
- .Caption = "Sierpinski-Dreieck"
- .WindowState = vbMaximized
- .KeyPreview = True
- End With
- End Sub
- Private Sub Form_Activate()
- ' Stufe abfragen
- Stage = Val(InputBox("Iterationsstufe? (0 - 8)", Me.Caption, 6))
- Me.MousePointer = vbHourglass
- ' Stufe begrenzen
- If Stage < 0 Then
- Stage = 0
- ElseIf Stage > 8 Then
- Stage = 8
- End If
- Call CalcTriangle ' Rechnen
- Call DrawTriangle ' Zeichnen
- Me.MousePointer = vbDefault
- End Sub
- Private Sub CalcTriangle()
- ' Dreiecke berechnen
- Dim i&, j&, k&, IT&, g&
- Dim S!, Rand!, SW!, SH!, XP!, YP!
- Dim Triangle2() As Triple
- Rand = 8 ' Randabstand
- SW = Me.ScaleWidth
- SH = Me.ScaleHeight
- S = (SH - 2 * Rand) / Sqr(3)
- ReDim Triangle1(0)
- ' 1. Dreieck belegen
- For i = 0 To 2
- With Triangle1(0).PtList(i)
- .x = SW / 2 + Choose(i + 1, 0, -S, S)
- .y = IIf(i = 0, Rand, SH - Rand)
- End With
- Next i
- ' Alle Iterations-Stufen durchlaufen
- For IT = 1 To Stage
- ' Arrays anlegen
- g = UBound(Triangle1)
- ReDim Triangle2(g)
- Triangle2 = Triangle1
- ReDim Triangle1((g + 1) * 3 - 1)
- ' Dreiecke berechnen und eintragen
- For i = 0 To g
- For j = 0 To 2
- With Triangle1(3 * i + j)
- For k = 0 To 2
- With Triangle2(i)
- XP = .PtList(j).x
- YP = .PtList(j).y
- If k > 0 Then
- With .PtList((j + k) Mod 3)
- XP = (XP + .x) / 2
- YP = (YP + .y) / 2
- End With
- End If
- End With
- With .PtList(k)
- .x = XP
- .y = YP
- End With
- Next k
- End With
- Next j
- Next i
- Next IT
- ' Speicher freigeben
- Erase Triangle2
- End Sub
- Private Sub DrawTriangle()
- ' Dreiecke zeichnen
- Dim i&, j&, Figur(2) As POINTAPI
- With Me
- .Caption = .Caption & Space$(10) & "Stufe " & Stage
- .BackColor = vbWhite ' Hintergrundfarbe
- .ForeColor = vbRed ' Kantenfarbe Dreiecke
- .FillColor = vbRed ' Füllfarbe Dreiecke
- .FillStyle = vbFSSolid
- .AutoRedraw = True
- .Cls
- ' Alle Dreiecke durchgehen
- For i = 0 To UBound(Triangle1)
- ' Eckpunkte übertragen
- For j = 0 To 2
- With Triangle1(i).PtList(j)
- Figur(j).x = .x
- Figur(j).y = .y
- End With
- Next j
- ' Dreieck zeichnen
- Call Polygon(.hdc, Figur(0), 3)
- Next i
- .FillStyle = vbFSTransparent
- End With
- End Sub
- Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer)
- ' Beenden
- If KeyCode = vbKeyEscape Then Unload Me
- End Sub
Gruss,
Neptun
Neptun
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Neptun“ ()