Turtle-Grafik

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Lothar Schirm
Beiträge: 41
Registriert: 30.04.2012 16:38

Turtle-Grafik

Beitrag von Lothar Schirm »

Eine kleine Turtle-Grafik-Bibliothek:

Code: Alles auswählen

;==============================================================================
; Turtle.pbi
; Turtle-Grafik
; Erstellt am 02.05.2013
; Letzte Bearbeitung am 05.08.13
;==============================================================================


EnableExplicit

; Diese Variablen müssen zu Anfang initialisiert werden (TurtleAngle in Grad),
; TurtleX, TurtleY = Pixelkoordinaten (ganzzahlig)
Global.d TurtleAngle
Global TurtleX, TurtleY



Procedure TurtleMove(distance, PenDown = #True)
  ; Bewegt die Schildkröte um die angegebene Distanz. 
  ; Falls PenDown = #True, wird eine Linie gezeichnet.
  
  Protected dx, dy 
  
  dx = distance * Cos(Radian(TurtleAngle))
  dy = -distance * Sin(Radian(TurtleAngle))
  If PenDown = #True
    LineXY(TurtleX, TurtleY, TurtleX + dx, TurtleY + dy)
  EndIf
  TurtleX = TurtleX + dx
  TurtleY = TurtleY + dy
  
EndProcedure


Procedure TurtleMoveTo(x, y, PenDown = #True)
  ; Bewegt die Schildkröte zur Position (x, y).
  ; Falls PenDown = #True, wird eine Linie gezeichnet.
  
  If PenDown = #True
    LineXY(TurtleX, TurtleY, x, y)
  EndIf
  TurtleX = x
  TurtleY = y
  
EndProcedure


Procedure TurtleTurn(angle.d)
  ; Dreht die Richtung am den angegebenen Winkel in Grad. 
  ; angle > 0: Linksdrehung
  ; angle < 0: Rechtsdrehung
  
  TurtleAngle = TurtleAngle + angle
  
EndProcedure
Und hier ein Beispielprogramm:

Code: Alles auswählen

;==============================================================================
; Turtelei.pb
; Ein bisschen mit Turtle-Grafik experimentieren
; Erstellt am 05.08.2013
;==============================================================================


EnableExplicit

IncludeFile "Turtle.pbi"

Enumeration
  #Window_0
EndEnumeration

Enumeration
  #Canvas_0
  #Canvas_1
  #Canvas_2
  #Canvas_3
EndEnumeration

Define i, j, d, phi, event

; Mach ein Fenster mit vier CanvasGadgets auf:
OpenWindow(0, 0, 0, 800, 800, "Turtelei", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
CanvasGadget(#Canvas_0, 0, 0, 400, 400, #PB_Canvas_Border)
CanvasGadget(#Canvas_1, 400, 0, 400, 400, #PB_Canvas_Border)
CanvasGadget(#Canvas_2, 0, 400, 400, 400, #PB_Canvas_Border)
CanvasGadget(#Canvas_3, 400, 400, 400, 400, #PB_Canvas_Border)

; Rechteckige Spirale:
StartDrawing(CanvasOutput(#Canvas_0))
d = 1
TurtleAngle = 0
TurtleX = 200
TurtleY = 200
For i = 1 To 255
  FrontColor(RGB(255 - i, 0, i))
  TurtleMove(d)
  TurtleTurn(-90)
  d = d + 1
Next
StopDrawing()

; Jetzt dreht sich die Spirale:
StartDrawing(CanvasOutput(#Canvas_1))
d = 1
TurtleAngle = 0
TurtleX = 200
TurtleY = 200
For i = 1 To 255
  FrontColor(RGB(255 - i, 0, i))
  TurtleMove(d)
  ;das ist der Dreheffekt:
  TurtleTurn(-91) 
  d = d + 1
Next
StopDrawing()

; Polygone:
StartDrawing(CanvasOutput(#Canvas_2))
d = 1
TurtleAngle = 0
For i = 1 To 180 Step 5
  FrontColor(RGB(i, 255 - i, 0))
  TurtleX = 200 - d / 2
  TurtleY = 200 - 0.9 * d
  For j = 1 To 6
    TurtleMove(d)
    TurtleTurn(-60)
  Next
  d = d + 5
Next
StopDrawing()

; Kreiselnde Kreise:
StartDrawing(CanvasOutput(#Canvas_3))
d = 7
FrontColor(#Blue)
For phi = 0 To 360 Step 12
  TurtleAngle = phi
  TurtleX = 200
  TurtleY = 200
  For i = 1 To 72
    TurtleMove(d)
    TurtleTurn(5)
  Next
Next
StopDrawing()

Repeat
  event = WaitWindowEvent()
Until event = #PB_Event_CloseWindow

End
Viel Spaß beim Turteln!
:)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Turtle-Grafik

Beitrag von RSBasic »

:allright:
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten