home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Simtel MSDOS 1992 September
/
Simtel20_Sept92.cdr
/
msdos
/
pgmutl
/
elan.zoo
/
turtle
/
turtle.eln
< prev
Wrap
Text File
|
1988-10-13
|
3KB
|
138 lines
LET turtle x limit = 100.0;
LET turtle y limit = 100.0;
enter turtle graphics:
INT VAR x base, y base;
REAL VAR x scale, y scale,
x range, y range,
x pos, y pos, dx, dy,
angle;
enter graphics mode;
INT CONST
size :: min (trunc (real (graphics x limit - 1)/aspect),
graphics y limit - 1),
xmin :: 1 + (graphics x limit -
trunc (real (size) * aspect) - 1) DIV 2,
ymin :: 1 + (graphics y limit - size - 1) DIV 2;
turtle window (xmin, xmin + size,
ymin, ymin + size,
turtle x limit, turtle y limit).
PROC turtle window (INT CONST xmin, xmax, ymin, ymax,
REAL CONST x rng, y rng):
x range := x rng + 1.0;
y range := y rng + 1.0;
x base := max (1, xmin);
y base := min (graphics y limit, ymax);
INT CONST x top :: min (graphics x limit, xmax);
INT CONST y bottom :: max (1, ymin);
x scale := real (x top - x base + 1) * aspect / x range;
y scale := real (y base - y bottom + 1) / y range;
angle := pi / 2.0;
dx := cos (angle);
dy := sin (angle);
x pos := 0.0;
y pos := 0.0;
move (x base, y base)
ENDPROC turtle window;
leave turtle graphics:
leave graphics mode.
PROC move (REAL CONST l):
move (x pos + dx * l, y pos + dy * l)
ENDPROC move;
PROC draw (REAL CONST l):
draw (x pos + dx * l, y pos + dy * l)
ENDPROC draw;
PROC new coord (REAL CONST x, y):
x pos := x;
y pos := y;
IF x < 0.0
THEN x pos := 0.0
ELIF x > x range
THEN x pos := x range
FI;
IF y < 0.0
THEN y pos := 0.0
ELIF y > y range
THEN y pos := y range
FI
ENDPROC new coord;
PROC move (REAL CONST x, y):
new coord (x, y);
move (trunc (x pos * x scale) + x base,
y base - trunc (y pos * y scale))
ENDPROC move;
PROC draw (REAL CONST x, y):
move (trunc (x pos * x scale) + x base,
y base - trunc (y pos * y scale));
new coord (x, y);
draw (trunc (x pos * x scale) + x base,
y base - trunc (y pos * y scale))
ENDPROC draw;
PROC turn (REAL CONST a):
angle INCR a;
dx := cos (angle);
dy := sin (angle)
ENDPROC turn;
PROC turn (INT CONST angle):
turn (pi * real (angle) / 180.0)
ENDPROC turn;
PROC turn right:
angle DECR pi / 2.0;
REAL CONST h :: dy;
dy := - dx;
dx := h
ENDPROC turn right;
PROC turn left:
angle INCR pi / 2.0;
REAL CONST h :: dy;
dy := dx;
dx := - h
ENDPROC turn left;
INT PROC ask int (TEXT CONST message):
INT VAR x; put (message); get (x); x
ENDPROC ask int;
REAL PROC ask real (TEXT CONST message):
REAL VAR x; put (message); get (x); x
ENDPROC ask real;
TEXT PROC ask text (TEXT CONST message):
TEXT VAR t; put (message); get (t); t
ENDPROC ask text;
REAL PROC sin (INT CONST a):
sin (pi * real (a) / 180.0)
ENDPROC sin;
REAL PROC cos (INT CONST a):
cos (pi * real (a) / 180.0)
ENDPROC cos;
PROC wait for confirmation (INT CONST x, y):
move (x, y);
put ("Hit space!");
TEXT CONST t :: inchar
ENDPROC wait for confirmation;
PROC leave graphics mode:
page;
enter text mode
ENDPROC leave graphics mode;