Turtle-Graphik (GFA)

Das Logo-Turtle-Graphics-Module ermöglicht Graphik-Freaks die Befehle, die die Turtle in LOGO steuern, in Basic oder anderen Programmiersprachen zu verwenden. Das Programm stellt somit eine echte Alternative zu der absoluten Positionierung dar. Bei der Emulation erscheint keine Turtle auf dem Screen, aber die Resultate sind identisch.

Das Programm ist zur Steuerung einer Turtle ausgelegt, aber durch Indizierung einiger Variablen lassen sich beliebig viele verwalten. Der „Befehlsatz“ des Programms wurde mit den „Graphikbewegungen“ des ST-Logo abgeglichen.

Die Proceduren PD, PE, PU, PX ermöglichen eine komfortablere Programmierung, aber auf Kosten der Geschwindigkeit (da nur ein Befehl in der Proc steht), deshalb sollte man ggf. auf den Aufruf der Procs verzichten und stattdessen z.B. PEN=0 statt @PU schreiben. Gleiches gilt für SETX und SETY.

Die Initialisierungsroutine muß immer am Anfang stehen, denn dort wird in Abhängigkeit von der Auflösung die Home-Position festgelegt.

Die Turtle wird dort hingesetzt und nach Norden ausgerichtet.

Normalerweise reicht eine Turtle aus, man kann aber durch kleine Änderungen z.B. 4 Turtles wie in ATARI-(XL)-Logo steuern; dazu dimensioniert man die Variablen heading, pen, xcor und ycor und führt zusätzlich eine Variable für die aktive Turtle ein.

BACKWARD :N     <=> @BK(N)
FORWARD :N      <=> @FD(N)
HEADING         <=> ? HEADING
HOME            <=> @HOME
LEFT :G         <=> @LT(G)
PENDOWN         <=> @PD             PEN=1
PENERASE        <=> @PE             COLOR 0
PENREVERSE      <=> @PX             GRAPHMODE 3
PENUP           <=> @PU             PEN=0
?POS            <=> ? XCOR,YCOR
RIGHT :G        <=> @RT(G)
SETHEADING :G   <=> HEADING=G
SETPAN [319 99] <=> HX=319 ;        HY=99
SETPOS [10 0]   <=> XCOR=10 ;       YCOR=0
SETX :N         <=> @SETX(N)        LINE xcor,ycor,xcor+n,ycor
SETY :N         <=> @SETX(N)        LINE xcor,ycor,xcor,ycor+n
?XCOR           <=> ? XCOR
?YCOR           <=> ? YCOR

Befehle, die emuliert werden

' --------------------------------
'      Turtle Graphics Module
'
'      GFA-Basic Version 1.8
'
'       $7C4 THE BYTESHIFTER
'
'   (c) MAXON Computer GmbH 1988
' --------------------------------
' INITIALIZATION
res=XBIOS(4)
IF res=0 OR res=1
  hy=99
ELSE
  hy=199
ENDIF
IF res=1 OR res=2
  hx=319
ELSE
  hx=159
ENDIF
xcor=hx
ycor=hy
'
' DEFAULTS
'
heading=0
pen=1
GOTO demo
' --------------------------------
PROCEDURE bk(x)
  LOCAL h,x1,x2,y1,y2
  h=((heading+180) MOD 360)/180*PI
  x2=xcor+INT(x*SIN(h)+0.5)
  y2=ycor-INT(x*COS(h)+0.5)
  IF pen=1
    x1=xcor
    y1=ycor
    LINE x1,y1,x2,y2
  ENDIF
  xcor=x2
  ycor=y2
RETURN
' --------------------------------
PROCEDURE fd(x)
  LOCAL h,x1,x2,y1,y2
  h=heading/180*PI
  x2=xcor+INT(x*SIN(h)+0.5)
  y2=ycor-INT(x*COS(h)+0.5)
  IF pen=1
    x1=xcor
    y1=ycor
    LINE x1,y1,x2,y2
  ENDIF
  xcor=x2
  ycor=y2
RETURN
' ---------------------------------
PROCEDURE home
  xcor=hx
  ycor=hy
  heading=0
RETURN
' ---------------------------------
PROCEDURE lt(x)
  heading=(360+heading-(x MOD 360)) MOD 360
RETURN
' ---------------------------------
PROCEDURE pd
  pen=1
RETURN
' ---------------------------------
PROCEDURE pe
  COLOR 0
RETURN
' ---------------------------------
PROCEDURE pu
  pen=0
RETURN
' ---------------------------------
PROCEDURE px
  GRAPHMODE 3
RETURN
' ---------------------------------
PROCEDURE rt(x)
  heading=(heading+x) MOD 360
RETURN
' ---------------------------------
PROCEDURE setx(x)
  IF pen=1
    LINE xcor,ycor,xcor+x,ycor
  ENDIF
  ADD xcor,x
RETURN
' ----------------------------------
PROCEDURE sety(x)
  IF pen=1
    LINE xcor,ycor,xcor,ycor+x
  ENDIF
  ADD ycor,x
RETURN
' =================================
demo:
SETCOLOR 0,0,0,0
DEFTEXT 1,4,0,8
TEXT 15,hy-32,"TO ENJOY THE DEMO..."
DEFTEXT 1,20,0,28
TEXT 0,hy,650,"FASTEN YOUR SEAT BELT !"
t=TIMER+600
REPEAT
UNTIL t=TIMER
SETCOLOR 0,7,7,7
SETCOLOR 0,0,0,0
CLS
FOR i=1 TO 9
  FOR j=1 TO 4
    @fd(60)
    @lt(90)
  NEXT j
  @rt(40)
NEXT i
' ---------------
CLS
@home
FOR i=1 TO 18
  FOR j=1 TO 6
    @fd(70)
    @rt(60)
  NEXT j
  @rt(20)
NEXT i
' ---------------
CLS
@home
FOR i=10 TO 200 STEP 4
  @fd(i)
  @rt(135)
NEXT i
' ---------------
FOR i=77 TO 298 STEP 17
  CLS
  @home
  FOR j=2 TO 5
    FOR k=10 TO 150 STEP j
      @fd(k)
      @lt(i)
    NEXT k
  NEXT j
NEXT i
' ---------------
CLS
@home
DEFLINE 3
FOR i=10 TO 1000 STEP 4
  @fd(i)
  @rt(130)
NEXT i
@home
DEFLINE 0
COLOR 0
FOR i=10 TO 1000 STEP 4
  @fd(i)
  @rt(130)
NEXT i
SETCOLOR 0,7,7,7
' ----------------
CLS
COLOR 1
f=20
g1=25
g2=g1*2
t=8
m=2^(t-1)-1
r=0
txt$="WINTER..."
DEFLINE 3
@tree
txt$="SPRING..."
DEFLINE 1
@tree
txt$="SUMMER..."
r=1
@tree
' ----------------
CLS
@home
pen=1
g=0
WHILE g<10000
  @fd(15)
  @rt(g)
  ADD g,34
WEND
TEXT 259,350,"ANY KEY TO EXIT"
' ----------------
REPEAT
UNTIL INKEY$>""
' ----------------
PROCEDURE tree
  x=hx-LEN(txt$)*4
  DEFTEXT 1,4,0,6
  TEXT x,300,txt$
  '
  @home
  @bk(50)
  @fd(50+f)
  @lt(g1)
  FOR i=0 TO m
    b$=BIN$(i)
    l=LEN(b$)
    IF l>0
      t$=STRING$(t-l,"0")+b$
    ELSE
      t$=b$
    ENDIF
    @home
    @lt(g1)
    FOR j=1 TO t
      IF MID$(t$,j,1)="0"
        @rt(g1)
        pen=0
        @fd(f)
        pen=1
        @v
      ELSE
        @lt(g1)
        pen=0
        @fd(f)
        pen=1
        @v
      ENDIF
    NEXT j
    IF r=1
      @w
    ENDIF
  NEXT i
RETURN
' ------------------
PROCEDURE v
  @lt(g1)
  @fd(f)
  @bk(f)
  @rt(g2)
  @fd(f)
  @bk(f)
  @lt(g1)
RETURN
' -------------
PROCEDURE w
  DEFLINE 1,0,0,1
  @lt(g1)
  pen=1
  @fd(f)
  pen=0
  @bk(f)
  @rt(g2)
  pen=1
  @fd(f)
  pen=0
  @bk(f)
  @lt(g1)
  DEFLINE 1,0,0,0
RETURN

Michael Agbaglo
Links

Copyright-Bestimmungen: siehe Über diese Seite