← ST-Computer 06 / 1989

Turtle-Graphik (GFA)

Programmierpraxis

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