1
0
mirror of https://github.com/PDP-10/its.git synced 2026-01-13 15:27:28 +00:00
PDP-10.its/doc/_info_/migs.order
Lars Brinkhoff f530e7f5fe MIGS - Muddle interactive graphics system.
Files courtesy of Rich Shiffman.
2021-02-09 20:44:08 +01:00

1313 lines
47 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

PAGE 1
M.I.G.S.
MANUAL
IDENTIFICATION
M.I.G.S. - MUDDLE INTERACTIVE GRAPHICS SYSTEM
RICHARD R. SHIFFMAN
OCTOBER 30, 1973
MOTIVATION
I HAVE FOUND THAT THERE IS A GENERAL NEED FOR AN
INTERACTIVE GRAPHICS SYSTEM THAT RUNS IN A TIMESHARING
ENVIRONMENT. THE GREATEST USE FOR SUCH A SYSTEM WOULD BE
IN ENGINEERING, MATH, AND PHYSICS. THE ADVANTAGES OF
INTERACTIVE GRAPHICS OVER
NORMAL COMPUTER AIDED INSTRUCTION ARE OBVIOUS. A
STUDENT OR RESEARCHER CAN SIT DOWN AT A LOW COST GRAPHICS
TERMINAL AND SEE A PICTURE OF THE FUNCTION HE IS
INTERESTED IN. THIS LEADS TO A BETTER UNDERSTANDING OF
THE PROBLEM, AND ALSO ALLOWS EXPERIMENTATION THAT WOULD
BE TOO DIFFICULT TO DO BY HAND. FOR A STUDENT THIS WOULD
MEAN GREATER INTEREST IN THE SUBJECT AND HOPEFULLY
BETTER UNDERSTANDING OF IT.
I BELIEVE THAT THE ARPA NETWORK IS IDEAL FOR THE
DEVELOPMENT OF SUCH A SYSTEM, SINCE IT IS EASILY ACCESSIBLE
FROM MANY COLLEGES AND RESEARCH CENTERS IN THE COUNTRY.
MY ORIGINAL CHOICE OF M.I.T.-D.M.C.G. AND MUDDLE TO
DEVELOP THIS PACKAGE WAS TAKEN AT RANDOM, BUT THE RESEARCH
ORIENTED ATMOSPHERE OF DMCG AND THE POWERFUL INTERACTIVE
ENVIRONMENT OF MUDDLE (A RECURSIVE LIST PROCESSING
LANGUAGE) PROVED IDEAL FOR THIS PROJECT
REFERENCES
1) A MUDDLE PRIMER, GREG PFISTER (SYS.11.01)
2) MICRO MUDDLE MANUAL, BRUCE DANIELS (SYS.11.03)
3) PRINCIPLES OF INTERACTIVE COMPUTER GRAPHICS, NEUMAN AND SPROULL
ACKNOWLEDGEMENTS
NOT BEING A MEMBER OF PROJECT MAC, BUT JUST A PERSON WHO
APPEARED ON THE SYSTEM, I WOULD REALLY LIKE TO
THANK EVERYBODY AT DMCG FOR TOLERATING ME ON THE SYSTEM.
IN THIS RESPECT I WOULD LIKE TO THANK AL VEZZA FOR THE
DIRECTORY AND THE CPU TIME. I WOULD ALSO LIKE TO THANK
GREG PFISTER, BRUCE DANIELS, AND CHRIS REEVE, WHO
REMAINED CIVIL, EVEN THOUGH I ALWAYS SEEMED TO LINK TO
THEM AT INOPPORTUNE TIMES AND ASKED MANY QUESTIONS.
PAGE 2
î
DESCRIPTION
AT THE PRESENT TIME MIGS IS STILL UNDER DEVELOPMENT,
BUT IT IS QUITE USEABLE, AS DEMONSTRATED BY ITS USE ON
THE NETWORK MUDDLE SOCKET BY SEVERAL STUDENTS HERE AT
USC AND A RESEARCH GROUP IN THE EE DEPARTMENT WHO
USES MIGS TO STUDY RADAR AMBIGUITY FUNCTIONS. AT THIS
TIME MIGS IS ABLE TO SUPPORT FOUR OF THE MOST COMMONLY
USED GRAPHICS TERMINALS; TEKTRONIX (4002, 4010), ARDS,
GT42'S AND IMLACS.
THE PACKAGE CONSISTS OF THREE MAIN PARTS.
THE FIRST IS THE INITIATOR WHICH ASKS THE USER WHAT TYPE
OF TERMINAL HE IS ON, AND LOADS THE APPROPRIATE FILES.
THE SECOND PART IS THE ON LINE HELP SUBSYSTEM, WHICH
EXPLAINS HOW TO USE MIGS TO A NEW USER. THE THIRD
PART CONSISTS OF THE GRAPHICS PRIMITIVES AS WELL AS THE
MORE COMPLEX DISPLAY SUBPROGRAMS. THESE FUNCTIONS WILL LET THE
USER MOVE AND DRAW TO HIS HEARTS CONTENT; PERFORM
CARTESIAN, POLAR, AND PARAMETRIC PLOTS OF A FUNCTION OF
ONE VARIABLE. MIGS ALSO WILL LET THE USER PRODUCE A
SURFACE PLOT OF A FUNCTION OF TWO VARIABLES WITH HIDDEN
LINES REMOVED. A CONTOUR PLOTTER WILL BE ADDED SOON.
SOME OF THE NEW DEVELOPMENTS THAT HAVE BEEN
RELEASED TO GENERAL USE, ARE THE DISPLAY COMPILER AND
DISPLAY PROCESSOR. THE DISPLAY COMPILER AND
PROCESSOR WILL GIVE THE USER THE ABILITY TO CREATE
PICTURES AND SUBPICTURES, AND THEN TRANSFORM THEM (I.E.
ROTATION, TRANSLATION, AND SCALING).
PAGE 3
CONTENTS PAGE
CHAPTER 0. LOADING MIGS
0.1. LOADING MUDDLE AND MIGS 4
0.2. TENEX MUDDLE 4
CHAPTER 1. INITIALIZATION OF MIGS
1.1 DESCRIBING YOUR TERMINAL TO MIGS 5
1.2 USE OF THE HELP FUNCTION 5
CHAPTER 2. MIGS PRIMITIVES
2.1. MOVE AND DRAW 6
2.2. POINT 7
2.3. LINE 7
2.4. PLOTV AND PLOTVDSK 7
2.5. DSKIMAGE 8
2.6. CIRCLE AND ELIPSE 8
2.7. PAGE 8
2.8. MOVE3D AND DRAW3D 9
2.9. POINT3D 9
2.10. LINE3D 10
2.11. PLOTV3D 10
2.12. PROJ 11
2.13. SETORG AND SETPROJ 11
CHAPTER 3. PLOTTING FUNCTIONS
3.1. FNCTG 13
3.2. PARAG 14
3.3. POLRP 15
CHAPTER 4. SURFACE PLOTTING
4.1. SFXYP 16
4.2. MIJPL 17
4.3. M3D AND M3DSK 18
CHAPTER 5. THE DISPLAY COMPILER
5.1. MCELL 19
5.2. DISP 22
5.3. CALL 22
5.4. XLATE 23
5.5. SCALE 24
5.6. ROTZ 24
5.7. ROTX 25
5.8. ROTY 25
5.9. CREATING YOUR OWN TRANSFORMS 25
5.10. SETCLIP 26
APPENDICIES
A.1 SOME EXAMPLES OF THE USE OF MIGS PRIMITIVES 27
A.2 EXAMPLES OF THE DISPLAY COMPILER AND PROCESSOR 28
PAGE 4
BODY
CHAPTER 0
LOADING MIGS
0.1 LOADING MUDDLE AND MIGS
IF YOU ARE ON AN "ITS" SYSTEM, DMS, SAY MUDDLE^K OR :MUDDLE<CR> TO
DDT. THIS WILL LOAD A MUDDLE AND START IT RUNNING FOR YOU. ON "ITS"
TO DELETE A CHARACTER USE RUBOUT. IF YOU ARE ON A TENEX, SAY MUDDLE<CR>
OR <MUDDLE>MUDDLE.SAV<CR> TO THE EXEC. REMEMBER THAT ON TENEX,
^A IS USED TO DELETE A CHARACTER. ^S, ^G, ^D, AND ^L
WORK THE SAME IN EITHER "ITS" OR TENEX, IN TENEX THE MEANING OF ^Z
AND ^C ARE REVERSED.
NOW THAT YOU HAVE A MUDDLE, THE NEXT THING IS TO LOAD MIGS. IF
YOU ARE ON DM ("ITS"), SAY <FLOAD RRS;MIGS INIT>$ TO MUDDLE.
IF YOU ARE USING THE TENEX AT USCECL TYPE <FLOAD "<MUDDLE>MIGS.INIT">$
AT MUDDLE. IF YOU ARE ON ANOTHER TENEX THAT HAS MUDDLE AND MIGS,
REPLACE "<MUDDLE>" WITH THE NAME OF THE DIRECTORY THAT MIGS IS IN.
0.2 TENEX MUDDLE
THERE IS ONE SMALL DIFFERENCE IN MIGS FOR TENEX MUDDLE, AT THE
PRESENT TIME. WHEN MIGSINT IS ASKING YOU WHAT KIND OF TERMINAL YOU
ARE ON, YOU HAVE TO TYPE AN <ESC> AFTER THE CHARACTER. THIS IS BECAUSE
AT THIS TIME THERE ISN'T A TYI IN TENEX MUDDLE. MIGS LOADS IT OWN
TYI RSUBR AT THE END OF MIGSINIT.
PAGE 5
CHAPTER 1
INITIALIZATION OF MIGS
1.1 DESCRIBING YOUR TERMINAL TO MIGS
WHEN MIGS STARTS TO RUN THE FIRST THING IT DOES IS ASK
YOU WHAT TYPE OF TERMINAL YOU ARE USING. TO TELL MIGS, YOU TYPE
ONE LETTER AT IT; 'A' IS FOR ARDS AND IMLACS, 'T' IS FOR TEKTRONIX,
AND 'G' IS FOR GT42'S. AT THIS TIME YOU CAN ALSO TYPE 'H' AND INVOKE
THE HELP SUBSYSTEM. MIGS WILL THEN LOAD THE RIGHT GRAPHICAL
PRIMITIVES FOR YOUR TERMINAL, AND INFORM YOU THAT IT HAS DONE
SO. NEXT IT WILL ASK IF YOU WANT THE DISPLAY COMPILER. THE DISPLAY
COMPILER IS QUITE LARGE, SO IF YOU JUST WANT TO HACK AROUND AND
PLOT FUNCTIONS YOU WONT NEED IT, BUT IF YOU WANT TO DO MORE COMPLEX
THINGS LOAD IT. ONCE YOU DECIDE TYPE 'Y' FOR YES, OR 'N' FOR NO.
AFTER A LITTLE WHILE MIGS WILL REPLY 'MIGS LOAD', NOW YOU ARE READY
TO PLOT TO YOUR HEARTS CONTENT. IF YOU DECIDE THAT YOU WANT THE
DISPLAY COMPILER AT SOME LATER TIME, OR WANT TO CHANGE TERMINALS
TYPE <MIGSINIT>$ AND REPEAT THE ABOVE.
1.2 THE HELP SUBSYSTEM
THE MIGS HELP SUBSYSTEM IS AVAILABLE ANY TIME MIGS IS LOADED.î.
WHEN MIGS IS BEING INITIALIZED IT MAY BE INVOKED BY TYPING A 'H'
TO MIGS, AS I DESCRIBED ABOVE. AT ANY OTHER TIME TYPE <MIGSHELP>$
AND YOU'LL GET THE HELP SUBSYSTEM. THIS SUBSYSTEM WILL GIVE YOU A
A SHORT DESCRIPTION OF THE FUNCTION IN MIGS. YOU CAN TYPE HELP$
AND IT WILL LIST THE THINGS FOR WHICH IT HAS INFO. THEN YOU TYPE THE
NAME OF THE FUNCTION YOU'RE INTERESTED IN FOLLOWED BY AN $, AND THE
HELP SUBSYSTEM WILL DESCRIBE IT. THE DESCRIPTION IS OF THE FOLLOWING
FORM: FUNCTION NAME, NUMBER OF ARGS., HOW TO USE IT. TO LEAVE
THE HELP SUBSYSTEM TYPE RETURN$.
PAGE 6
CHAPTER 2
MIGS PRIMITIVES
BEFORE I GO ON I WOULD LIKE TO POINT OUT THAT THROUGHOUT THIS
MANUAL I AM ASSUMING THAT THE ORIGIN IS AT THE LOWER LEFT
CORNER OF THE SCREEN, AND THE UPPER RIGHT CORNER IS AT (1023,1023).
IF YOU LIKE THE ORIGIN AT THE CENTER OF THE SCREEN READ HOW TO USE
SETORG, SETPROJ, AND SETCLIP.
2.1 MOVE AND DRAW
THIS SEEMS LIKE A GOOD PLACE TO START SINCE MOVING AND DRAWING
THE BEAM AROUND ON THE SCOPE IS ABOUT THE MOST BASIC THING YOU CAN
DO. THE FUNCTION MOVE TAKES TWO ARGUMENTS, THE X AND Y POSITION
OF WHERE YOU WANT THE BEAM. THEN IT SET THE SCOPE IN GRAPHICS MODE AND
MOVES THE BEAM THERE INVISIBLY. THE FUNCTION DRAW TAKES A X AND Y
POSITION AND DRAWS (MOVES THE BEAM VISIBLY) FROM WHERE IT WAS TO
POSITION YOU GAVE IT. SINCE MOVE SET THE SCOPE IN GRAPHICS MODE IT MUST
BE CALLED BEFORE THE FIRST CALL TO DRAW, ALSO YOU SHOULDNT DROP OUT
OF GRAPHICS MODE INîBETWEEN DRAWS. THE ARGUMENT TO MOVE AND DRAW
MUST BE INTEGER AND SHOULD BE INSIDE THE SCREEN BOUNDARIES OR
STRANGE THINGS WILL HAPPEN. I WILL NOW GIVE A COUPLE OF EXAMPLES
ILLUSTRATING THE RIGHT AND WRONG WAY TO USE MOVE AND DRAW.
EX 2.1.1 THE RIGHT WAY
<PROG () <MOVE 100 100> <DRAW 500 600>>;"THIS WILL DRAW A LINE
FROM (100,100) TO
(500,600)."$
<PROG () <MOVE 0 0>
<DRAW 0 1023>
<DRAW 1023 1023>
<DRAW 1023 0>
<DRAW 0 0>>;"DRAWS A BIG SQUARE"$
EX 2.1.2 THE WRONG WAY
<MOVE 0 0><DRAW 60 100>;"THIS WILL DROP OUT OF GRAPHICS MODE
INîBETWEEN THE MOVE AND DRAW"$
<PROG () <DRAW 76 68> <MOVE 50 300>>;" THERE MUST BE A MOVE BEFORE
DRAW"$
PAGE 7
2.2 POINT
THIS FUNCTION TAKES TWO ARGUMENTS THE X AND Y COORDINATES
THEN DISPLAYS A POINT ON THE SCREEN. THE ARGUMENTS TO POINT
MUST BE OF TYPE FIX AND SHOULD BE IN THE VISIBLE
AREA OF THE SCREEN.
EX 2.2.1
<POINT 500 500>;"PUT A POINT AT (500,500)"$
EX 2.2.2
<DEFINE FOO ( "AUX" (X 400) Y)
<REPEAT ()
<SET Y </ <* <- .X 500> <- .X 500>> 10>>
<POINT .X .Y>
<POINT .X 0>
<POINT 500 .Y>
<COND (<G? <SET X <+ .X 1>> 599> <RETURN "DONE">)>>>
;"THIS WILL PRODUCE A PARABOLA AND AXES ON THE
SCREEN WHEN USED."$
<FOO>;"LETS TRY IT"$
2.3 LINE
THE FUNCTION LINE DISPLAYS A LINE ON THE SCREEN, WHICH IS
SPECIFIED BY ITS END-POINTS. THE FUNCTION TAKE 4 ARGUMENTS
WHICH MUST BE FIXED. THE FIRST TWO ARE THE X AND Y COORDINATES
OF THE FIRST END-POINT THE LAST TWO ARE X AND Y COORDINATES
FOR THE SECOND END-POINT OF THE LINE SEGMENT YOU WANT TO DRAW.
EX 2.3.1
<LINE 100 100 100 800>
<LINE 100 800 800 800>
<LINE 800 800 800 100>
<LINE 800 100 100 100>;"THIS WILL DRAW A RECTANGLE ON
THE SCREEN. NOTICE THAT LINE
DOESNT HAVE TO BE IN A FUNCTION
OR A PROG."$
2.4 PLOTV AND PLOTVDSK
PLOTV IS USED TO PLOT TWO LISTS, VECTORS, OR UVECTORS
AGAINST EACH OTHER. THE FIRST LIST (VECTOR,UVECTOR) IS USED
AS THE X COORDINATES, AND THE SECOND IS USED AS THE Y
COORDINATES. PLOTV MOVES THE BEAM TO THE FIRST PAIR OF
COORDINATES AND DRAWS TO THE REST. THE ELEMENTS OF THE LISTS
(VECTORS, UVECTORS) MUST BE OF TYPE FIX, AND THE LISTS MUST
BE OF THE SAME LENGTH,OR YOU GET AN ERROR.
PLOTVDSK IS IDENTICAL TO PLOTV IN HOW IT HANDLES ITS FIRST
TWO ARGUMENTS, BUT IT TAKES A THIRD ARGUMENT A DSK CHANNEL
TO WRITE ITS OUTPUT ON. YOU CAN VIEW THIS BY USING THE FUNCTION
DSKIMAGE.
EX 2.4.1
<PLOTV ![100 800 800 100 100]
![100 100 800 800 100]>;"THIS DRAWS THE RECTANGLE AGAIN"$
PAGE 8
2.5 DSKIMAGE
DSKIMAGE IS USED TO DISPLAY A DISK FILE IN IMAGE MODE ON YOUR
SCOPE. IT TAKES ONE OPTIONAL ARGUMENT, A STRING WHICH IS THE
THE NAME OF THE DSK FILE YOU WANT TO DISPLAY. DSKIMAGE DEFAULTS
TO <STRING <SNAME> ";M3D MIGPUT">. THIS FUNCTION IS USED
IN CONJUNCTION WITH M3DSK OR PLOTVDSK, BUT CAN BE USED TO DISPLAY
ANY FILE (NOTE IF IT CONTAINS A CONTROL-L IT WILL CLEAR THE SCREEN).
EX 2.5.1
SUPPOSE THAT YOU HAVE A SURFACE PLOT PRODUCED BY M3DSK IN A FILE IN
YOUR DIRECTORY NAMED FOO BAR.
<DSKIMAGE "FOO BAR">;"THIS DISPLAYS FOO BAR FOR YOU"$
2.6 CIRCLE AND ELIPSE
CIRCLE TAKES FOUR ARGUMENTS OF TYPE FIX. THE FIRST TWO
ARE THE X AND Y COORDINATES OF THE CENTER OF THE CIRCLE TO
BE DISPLAYED, THE NEXT IS THE RADIUS OF THE CIRCLE, AND
THE LAST IS THE NUMBER OF POINTS IN IT. BESIDES DRAWING
CIRCLES, CIRCLE CAN BE USED TO GENERATE REGULAR POLYGONS.
ELIPSE IS SIMILAR TO CIRCLE EXCEPT THAT IT TAKES FIVE
ARGUMENTS AND DRAWS AN ELLIPSE. THE FIRST TWO ARGUMENTS ARE
COORDINATES OF THE CENTER. THE NEXT TWO ARE THE LENGTHS OF
THE X AND Y SEMI-AXIS RESPECTIVELY. THE LAST IS THE NUMBER
OF POINTS IN THE ELLIPSE. IF THE THIRD AND FOURTH ARGUMENTS
ARE EQUAL THEN ELIPSE WILL HAPPILY DRAW A CIRCLE.
EX 2.6.1
<CIRCLE 500 500 300 100>;" MAKES A CIRCLE AT THE CENTER OF
THE SCREEN (500,500), WITH RADIUS
OF 300, AND 100 POINTS IN IT"$
<CIRCLE 500 500 300 6>;" THIS INSCRIBES A HEXAGON IN THE
CIRCLE WE JUST DREW"$
EX 2.6.2
<ELIPSE 500 500 400 300 100>;" PUT AN ELLIPSE AROUND THE
THE CIRCLE AND HEXAGON THAT
TOUCHES THE TOP AND BOTTOM
OF THE CIRCLE."$
2.7 PAGE
IF YOU GET TIRED OF PUSHING THE ERASE OR THE FORM KEY ON YOUR
TERMINAL WHEN YOU WANT WHATS ON THE SCREEN TO GO AWAY, YOU CAN
USE PAGE AND GET THE SAME RESULTS. PAGE TAKES NO ARGUMENTS.
IF YOU USE PAGE IN A PROGRAM AND ARE ON AN ARDS OR TEKTRONIX
YOU SHOULD ALLOW ABOUT ONE SECOND BEFORE YOU DRAW AGAIN TO
MAKE THE SCOPE HAPPY. NOTE THAT THIS IS USEFUL IN TENEX MUDDLE, WHICH
DOESN'T KNOW HOW TO CLEAR THE SCREEN.
EX 2.7.1
<PAGE>;" WELL I GAVE AN EXAMPLE FOR EVERYTHING ELSE"$
PAGE 9
2.8 MOVE3D AND DRAW3D
THIS IS THE START OF THE DESCRIPTION OF THE THREE
DIMENSIONAL PRIMITIVES. THEY ARE SIMILAR TO THEIR TWO DIMENSIONAL
COUNTERPARTS, EXCEPT THAT THEY TAKE A Z COORDINATE. ALSO THE
3D PRIMITIVES WILL WORK WITH ARGUMENTS OF THE TYPE FIX OR FLOAT. I
WOULD LIKE TO POINT OUT AT THIS TIME THAT THE POSITIVE DIRECTION OF
THE Z AXIS IS INTO THE SCREEN, AND Z = 0 IS AT THE SCREEN.
THE FUNCTION MOVE3D SETS THE SCOPE IN GRAPHICS MODE AND
MOVES THE BEAM INVISIBLY TO THE POINT YOU SPECIFY. MOVE3D TAKES
THREE ARGUMENTS; THE X, THE Y, AND THE Z COORDINATE OF THE POINT. SINCE
MOVE3D SETS THE SCOPE IN GRAPHICS MODE IT MUST BE CALLED BEFORE THE
FIRST CALL TO DRAW3D.
DRAW3D MOVES THE BEAM VISIBLY FROM WHERE IT IS TO THE COORDINATES THAT
YOU GIVE IT. DRAW3D TAKES THREE ARGUMENTS, THEY ARE THE SAME AS THE
ARGUMENT TO MOVE3D. BEFORE YOU CAN USE DRAW3D YOU MUST BE IN GRAPHICS
MODE, AND DON'T DROP OUT OF GRAPHICS MODE INîBETWEEN CALLS TO DRAW3D.
EX 2.8.1
<PROG () <MOVE3D 0 0 0>
<DRAW3D 100 200 300>
<DRAW3D 500 400 -300>
<DRAW3D 0 0 0>>;"THIS WILL DRAW A TRIANGLE WITH ITS
VERTICES AT (0,0,0),(100,200,300),
AND (500,400,-300)"$
2.9 POINT3D
THIS FUNCTION TAKES THREE ARGUMENTS. THE ARE THE X,
THE Y, AND THE Z COORDINATES OF A POINT TO DISPLAY ON THE
SCREEN. POINT3D ENTERS GRAPHICS MODE DISPLAYS THE POINT AND
THEN DROPS OUT OF GRAPHICS MODE WHENEVER IT IS INVOKED, SO
IT IS SAFE TO USE AT ANY TIME. THE ONLY RESTRICTION IS THE
PROJECTION OF THE POINT SHOULD BE VISIBLE.
EX 2.9.1
<REPEAT ((X 0)(Y 0) (Z 0))
<POINT3D .X
<+ 500 .Y>
.Z>
<SET X <+ 10 .X>>
<SET Y <* 500 <SIN <* 6.28E-3 .X>>>>
<SET Z .X>
<COND (<G? .X 1000> <RETURN ,NULL>)>>;"
THIS WILL DRAW A SIN WAVE WHICH STARTS ON THE
LEFT SIDE OF THE SCREEN AND HEADS OFF INTO THE DISTANCE
UNTIL IT RUNS OUT OF POINTS."$
PAGE 10
2.10 LINE3D
THE FUNCTION LINE3D WILL DISPLAY THE PROJECTION OF A LINE
IN THREE SPACE ON THE SCREEN OF YOUR TERMINAL. LINE3D TAKES
SIX ARGUMENTS, THEY ARE THE X, Y, AND Z COORDINATES OF THE TWO
END-POINTS OF THE LINE. THE END-POINTS SHOULD BE ON THE VISIBLE
PART OF THE SCREEN OR STRANGE THINGS WILL HAPPEN. LINE3D ENTERS AND
LEAVES GRAPHICS MODE ITSELF SO IT CAN BE CALLED AT ANY TIME.
EX 2.10.1
<LINE3D 0 0 0 1000 1000 1000>
<LINE3D 1000 0 1000 600 0 600>
<LINE3D 600 0 600 0 0 0>
<LINE3D 0 0 0 500 1000 500>
<LINE3D 1000 0 1000 500 1000 500>
<LINE3D 600 0 600 500 1000 500>;"THIS WILL DRAW A PYRAMID
ON THE SCOPE."$
2.11 PLOTV3D
THIS FUNCTION IS QUITE SIMILAR TO ITS TWO DIMENSIONAL ANALOG,
PLOTV. PLOTV3D TAKES THREE ARGUMENTS THEY MUST BE OF TYPE LIST,
VECTOR, OR UVECTOR. THE FIRST ARGUMENT IS TAKEN
AS THE X COORDINATES, THE SECOND IS THE Y COORDINATES, AND THE
THIRD IS THE Z COORDINATES. THE LISTS, VECTORS, OR UVECTORS
THAT ARE THE X, Y, AND Z COORDINATES MUST BE OF THE SAME LENGTH
OR ELSE YOU WILL GET AN ERROR.
EX 2.11.1
<DEFINE CUBE (X0 Y0 Z0 X1 Y1 Z1);"THIS FUNCTION WILL DRAW
CUBE ON THE SCREEN. IT USES
PLOTV3D AND LINE3D."
<PLOTV3D ![.X0 .X0 .X1 .X1 .X0]
![.Y0 .Y1 .Y1 .Y0 .Y0]
![.Z0 .Z0 .Z0 .Z0 .Z0]>
<PLOTV3D ![.X0 .X0 .X1 .X1 .X0]
![.Y0 .Y1 .Y1 .Y0 .Y0]
![.Z1 .Z1 .Z1 .Z1 .Z1]>
<LINE3D .X0 .Y0 .Z0 .X0 .Y0 .Z1>
<LINE3D .X0 .Y1 .Z0 .X0 .Y1 .Z1>
<LINE3D .X1 .Y1 .Z0 .X1 .Y1 .Z1>
<LINE3D .X1 .Y0 .Z0 .X1 .Y0 .Z1>>$
<CUBE 200 200 0 400 400 200>;"DRAW A CUBE WITH ONE CORNER
AT (200,200,0) AND THE OPPOSITE
CORNER AT (400,400,200)."$
PAGE 11
2.12 PROJ
PROJ IS NOT A GRAPHICAL PRIMITIVE, BUT IS MIGS'S PROJECTION
ROUTINE. I FIGURED THAT IT MIGHT BE OF SOME USE IN FUNCTIONS
THAT A USER MIGHT WRITE SO I WILL DESCRIBE IT. PROJ TAKES
FOUR ARGUMENTS. THE FIRST THREE ARE REQUIRED AND ARE THE
X, Y, AND Z COORDINATES OF A POINT IN THREE SPACE. THE FOURTH
ARGUMENT IS THE DISTANCE FROM THE SCREEN TO THE EYE AND IS
OPTIONAL. THE DEFAULT EYE POSITION IS (512 512 1024), THAT IS
THE CENTER OF THE SCREEN AND ABOUT 10 INCHES IN FRONT OF IT.
THIS CAN BE CHANGED BY THE FUNCTION SETPROJ DESCRIBED IN 2.13.
PROJ RETURNS A TWO ELEMENT LIST, WHICH IS THE X AND Y CO-
ORDINATES OF THE POINT PROJECTED ON THE Z=0 PLANE.
EX 2.12.1
<DEFINE POINT3 (X Y Z);"THIS FUNCTION IS A 3D POINT PLOTTER
IT USES POINT AND PROJ."
<POINT !<PROJ .X .Y .Z>>>;"NOTE THE USE OF
THE SEGMENT TO MAKE
POINT HAPPY"$
<POINT3 200 300 400>;"DISPLAY A POINT AT (200,300,400)."$
2.13 SETORG AND SETPROJ
THE FUNCTIONS SETORG AND SETPROJ LET THE USER CHANGE THE
ORIGIN AND THE EYE POSITION FOR PROJECTION RESPECTIVELY.
BY THE USE OF THESE TWO FUNCTIONS YOU CAN MOVE THE ORIGIN
TO THE CENTER OF THE SCREEN IF YOU DON'T LIKE IT IN THE
LOWER LEFT CORNER.
SETORG TAKES TWO OPTIONAL ARGUMENTS (DEFAULT IS 0),
THEY ARE THE COORDINATES OF THE LOGICAL ORIGIN IN THE PHYSICAL
COORDINATES OF THE TERMINAL YOU ARE USING. IF THE SCOPE YOU
ARE USING IS A TEKTRONIX, THEN THE SCOPE'S COORDINATES RUN FROM
0 TO 1023 AND THE PHYSICAL ORIGIN IS AT THE LOWER LEFT (0,0).
IF YOU THEN WANT THE LOGICAL ORIGIN AT THE CENTER OF THE SCREEN
A SETORG OF 512,512 WOULD DO IT. IF YOU ARE ON AN ARDS OR IMLAC
THE PHYSICAL ORIGIN IS AT THE CENTER OF THE SCREEN AND THE
COORDINATES RUN FROM -511 TO 511. TO SHIFT THE COORDINATE SYSTEM
TO WHAT THE TEKTRONIX USES, DO A SETORG OF -512,-512.
WHEN YOU LOAD MIGS IT DEFAULTS TO THE LOGICAL ORIGIN AT LOWER
LEFT OF THE SCREEN.
SETPROJ TAKES THREE OPTIONAL ARGUMENTS; THE X AND Y COORDINATES
OF THE EYE AND THE DISTANCE FROM THE EYE TO THE SCREEN. I FIND
THAT THE CENTER OF THE SCREEN AND AN EYE DISTANCE OF 800 TO
1024 LOOKS BEST. IF THE LOGICAL ORIGIN IS AT THE LOWER
LEFT CORNER THEN THE ARGUMENTS TO SETPROJ WOULD BE 512,512,1000. IF
THE LOGICAL ORIGIN IS AT THE CENTER OF THE SCREEN THEN THE
ARGS. WOULD BE 0,0,1000.
PAGE 12
EX 2.13.1
FOR TEKTRONIX SCOPES
ORIGIN AT THE LEFT
<SETORG 0 0>
<SETPROJ 511 511 1000>$
ORIGIN AT CENTER
<SETORG 512 512>
<SETPROJ 0 0 1000>$
EX 2.13.2
FOR ARDS AND IMLACS
ORIGIN AT THE LOWER LEFT
<SETORG -511 -511>
<SETPROJ 511 511 1000>$
ORIGIN AT CENTER
<SETORG 0 0 >
<SETPROJ 0 0 1000>$
PAGE 13
CHAPTER 3
PLOTTING FUNCTIONS
IN THIS CHAPTER I WILL DISCUSS THE FUNCTIONS THAT MIGS PROVIDES
FOR PLOTTING FUNCTIONS OF ONE VARIABLE. THE NEXT CHAPTER WILL
COVER SURFACE PLOTTING. AT THE MOMENT MIGS HAS THREE FUNCTIONS
THAT CONCERN THEMSELVES WITH PLOTTING, THEY ARE FNCTG, PARAG, AND
POLRP. RESPECTIVELY THEY PERFORM LINEAR, PARAMETRIC, AND POLAR
PLOTS OF THE FUNCTION THEY ARE GIVEN. IF YOU HAVE ANY FUNCTIONS
THAT YOU THINK ARE USEFUL LEAVE ME MAIL, AND I WILL SEE ABOUT ADDING
THEM TO MIGS.
ONE WORD OF WARNING, AT THE PRESENT TIME THE ORIGIN MUST BE AT THE
LOWER LEFT CORNER FOR THE PLOTTING FUNCTIONS TO WORK CORRECTLY.
THIS BUG WILL BE FIXED IN THE NEXT VERSION OF MIGS WHICH IS COMING
SOON.
3.1 FNCTG
THIS FUNCTION PRODUCES A LINEAR PLOT OF A FUNCTION OF ONE VARIABLE
VERSUS THAT VARIABLE. FNCTG TAKES SIX ARGUMENTS, OF THESE THE LAST
THREE ARE OPTIONAL. THE FIRST AND SECOND ARGUMENTS ARE THE LOWER
AND UPPER LIMIT OF THE VARIABLE RESPECTIVELY (WHICH IS PLOTTED
ALONG THE X AXIS). THIRD ARGUMENT MUST BE OF THE TYPE FUNCTION,
OR SUBR, OR RSUBR. IT IS APPLIED TO THE VARIABLE AND PLOTTED ON THE
Y AXIS. THE NEXT IS THE SCALE FACTOR. THIS IS A TWO ELEMENT LIST
CONTAINING THE X AND Y SCALE. THE FIFTH IS A TWO ELEMENT LIST
WHICH IS USED AS AN X,Y DISPLACEMENT OF THE PLOT. THE VALUE OF THIS LIST
SHOULD BE (<* .5 <+ .XMAX .XMIN>> <* .5 <+ .YMAX .YMIN>>). THIS
POINT IS MAPPED INTO THE CENTER OF THE SCREEN. THE SIXTH ARGUMENT IS
THE NUMBER OF POINTS TO PLOT, IT MUST BE OF TYPE FIX AND THE DEFAULT
IS SIXTY POINTS
IF THE ABOVE SOUNDS COMPLICATED, JUST GIVE FNCTG THE FIRST THREE
ARGUMENTS AND IT WILL DO THE REST (IT WILL AUTO-SCALE THE PLOT FOR
YOU). IF YOU STILL WANT AUTO-SCALING BUT WANT TO CHANGE THE NUMBER OF
POINTS MAKE THE FOURTH AND FIFTH ARGUMENTS TWO ELEMENT LISTS OF 0.
FNCTG RETURNS A TEN ELEMENT LIST THAT HAS USEFUL INFO ABOUT THE
PLOT IN IT. THIS IS PRINTED ON THE LEFT SIDE OF THE SCREEN UNLESS IT
IS SNARFED UP BY THE FUNCTION WHICH CALLED FNCTG.
PAGE 14
EX 3.1.1
<FNCTG 0 9 #FUNCTION((X) <* .X <COS .X>>)>
"THIS WILL PLOT THE FUNCTION F(X)=XCOS(X) FROM 0 TO 9"$
<DEFINE BAR (Y) <* .Y .Y>>$
<FNCTG -4.0 4.0 ,BAR>;"THIS WILL PLOT X**2 FOR X=-4 TO 4"$
EX 3.1.2
<FNCTG -4.0 4.0 ,BAR (0 0) (0 0) 120>;"THIS WILL PLOT THE
FUNCTION BAR WITH 120 POINTS INSTEAD OF 60"$
EX 3.1.3
<FNCTG -1 1 ,BAR (800 800)(.5 .5) 100>;"THIS WILL PLOT
BAR FROM -1 1, WITHOUT AUTO-SCALING AND WITH 100 POINTS"$
3.2 PARAG
THE FUNCTION, PARAG, PRODUCES A PARAMETRIC PLOT OF THE TWO
FUNCTIONS, OR RSUBRS THAT PARAG IS GIVEN AS ARGUMENTS. PARAG
TAKES 8 ARGUMENTS. THE FIRST FOUR ARE REQUIRED AND THE LAST FOUR
ARE OPTIONAL. THE FIRST AND SECOND ARGUMENTS ARE THE LOWER AND
UPPER BOUNDS OF THE PARAMETER RESPECTIVELY. THE NEXT TWO ARGUMENTS
ARE THE ATOMS WHOSE GVAL ,OR LVAL ARE THE FUNCTIONS YOU WANT
TO PLOT. THE FIFTH ARGUMENT IS THE NUMBER OF POINTS TO BE PLOTTED. IT
MUST BE OF TYPE FIX AND THE DEFAULT IS 60 POINTS. THE NEXT ARGUMENT
SELECTS THE SCALING MODE .IT MUST BE A STRING. PARAG HAS THREE
SCALING MODES, "SAS",SINGLE AUTO-SCALE SCALE THE PLOT SO ONE AXIS
WILL FILL THE SCREEN. THIS IS THE DEFAULT MODE. IN "DAS",DOUBLE
AUTO-SCALING MODE, THE PLOT WILL BE SCALED SO
IT FILLS THE SCREEN ALONG BOTH THE X AND Y AXES. ONE SHOULD NOTE THAT
THIS MODE DOES NOT PRESERVE THE ANGLE BETWEEN LINES, I.E. AN
ELLIPSE WILL BE STRETCHED INTO A CIRCLE. THE LAST MODE IS "NAS",
NO AUTO-SCALE. IN THIS MODE YOU MUST USE THE NEXT TWO ARGUMENTS,
THESE ARE BOTH TWO ELEMENT LISTS. THE FIRST ONE IS THE SCALE FACTORS
FOR THE PLOT (THE X SCALE AND THE Y SCALE). THE LAST ONE
IS AN X AND Y DISPLACEMENT FOR THE PLOT . THIS IS A TWO ELEMENT
LIST ALSO. I WOULD RECOMMEND THAT YOU STICK WITH "SAS" AND "DAS" MODES.
EX 3.2.1
<DEFINE A(X) <* .X <COS .X>>>$
<DEFINE B(Y) <* .Y <SIN .Y>>>;"MAKE TWO FUNCTIONS TO PLAY WITH"
<PARAG 0.0 10.0 A B>;"PLOT A SPIRAL"$
EX 3.2.2
<PARAG 0.0 <* .66667 3.14159E3> A B 100>;"HERE IS A SIRO NEIL"
EX 3.2.3
<PARAG 1.0 100. A LOG 200 "DAS">;"
THIS WILL PLOT A AGAINST LOG WITH 200 POINTS AND WILL EXPAND THE
PLOT TO FULL SCALE ALONG BOTH AXES.
PAGE 15
3.3 POLRP
THIS FUNCTION WILL PRODUCE A POLAR PLOT OF THE FUNCTION OR RSUBR
THAT YOU GIVE IT. POLRP TAKES SEVEN ARGUMENTS, OF WHICH THE FIRST
THREE ARE REQUIRED AND THE REST ARE OPTIONAL. THE FIRST TWO ARGUMENTS
ARE THE LOWER AND UPPER LIMITS ON THETA RESPECTIVELY. THE NEXT
ARGUMENT IS THE ATOM WHOSE GVAL IS THE FUNCTION YOU WANT PLOTTED.
THE LAST FOUR ARE ;THE NUMBER OF POINTS, THE MODE, SCALE, AND
THE X AND Y DISPLACEMENT. THESE ARGUMENTS ARE THE SAME AS THE LAST
FOUR ARGUMENTS OF PARAG. AS A MATTER OF FACT, POLRP CALLS PARAG AND
GIVES IT THE PARAMETRIC FORM OF YOUR POLAR FUNCTION.
EX 3.3.1
<POLRP 0.0 9 A>;"THIS WILL PLOT A=X*COS(X) IN POLAR COORDINATES,
FROM THETA EQUAL TO 0.0 TO 9.0 WITH 60 POINTS AND SINGLE AUTO-SCALING."$
PAGE 16
CHAPTER 4
SURFACE PLOTTING
THIS CHAPTER DESCRIBES HOW TO USE MIGS'S BUILT IN SURFACE PLOTTING
ABILITY. THERE ARE FOUR FUNCTIONS FOR SURFACE PLOTTING. THEY ARE
SFXYP, MIJPL, M3D, AND M3DSK. SFXYP WILL PLOT A FUNCTION OF TWO
VARIABLES FOR YOU. MIJPL WILL PLOT A SQUARE MATRIX , AND M3D(M3DSK)
IS USED BY BOTH OF THESE FUNCTIONS TO DO THE HIDDEN LINE ELIMINATION
AND THE DISPLAY. AT THE PRESENT TIME THE ORIGIN MUST BE AT THE
LOWER LEFT CORNER FOR SURFACE PLOTTING. NOTE THAT IF YOU ARE ON
AN IMLAC, DON'T TRY TO HAVE A DISPLAY OF MORE THAN 37X37 VECTORS OR
YOU WILL RUN OUT OF CORE.
4.1 SFXYP
THIS FUNCTION PLOTS FOR YOU ANY FUNCTION OF TWO INDEPENDENT VARIABLES
(I.E. Z=F(X,Y)). IT WILL AUTO-SCALE THE PLOT TO WHAT IT THINKS IS THE
BEST POSSIBLE DISPLAY. THE USER HAS THE OPTION OF PICKING THE
RESOLUTION, AND WHETHER THE OUTPUT GOES TO YOUR TERMINAL OR
DISK(THIS OPTION IS RARELY USED NOW THAT THE DISPLAY COMPILER
IS WORKING). THE CALL TO SFXYP IS
<SFXYP .XL .XH .YL .YH FUNCT .PARAM RES .DSK .FILE>.
THE FIRST 5 ARGUMENTS ARE REQUIRED THE REST ARE OPTIONAL. XL AND XH
ARE THE LIMITS ON X (LOW AND HIGH). THE Y LIMITS ARE YL , YH.
THE X AND Y LIMITS CAN BE FIXED OR FLOATS. FUNCT IS
THE ATOM WHOSE GVAL(LVAL) IS THE FUNCTION, RSUBR, FSUBR, OR SUBR THAT
YOU WANT TO PLOT. PARAM IS AN OPTIONAL LIST OF EXTRA ARGUMENTS
FOR THE FUNCTION. IF THE FUNCTION DOESN'T NEED ANY ,BUT YOU
WANT TO HAVE MORE ARGUMENTS TO SFXYP (SET THE RESOLUTION TO SOMETHING
OTHER THAT THE DEFAULT) MAKE IT AN EMPTY LIST. RES IS THE RESOLUTION
THAT WILL BE USED. THE DEFAULT IS 60. THIS MEANS THAT THE FUNCTION IS
PLOTTED ON A 60X60 GRID. RES MUST BE A FIX, AND THE TIME THAT SFXYP
TAKES GOES UP AS THE SQUARE OF RES, SO BE FOREWARNED. DSK DETERMINES
WHETHER SFXYP DOES ITS OUTPUT TO THE TERMINAL. IT CAN BE A TRUE
(ANYTHING THAT ISN'T FALSE) ,OR A FALSE (THIS IS THE DEFAULT). IF IT IS
TRUE THE OUTPUT GOES TO A DISK FILE, AND THE LAST ARG BETTER BE A
STRING WHICH IS THE NAME OF THE FILE. IF YOU DO THIS YOU CAN LOOK AT
THIS FILE WITH DSKIMAGE.
PAGE 17
EX 4.1.1
<DEFINE FOOBAR (X Y "AUX" (X1 <+ .X 1.0E-7>) (Y1 <+ .Y 1.0E-7>)
(R <SQRT <+ <* .X1 .X1><* .Y1 .Y1>>>))
</ <SIN <* 4.0 .R>> .R>>$
<SFXYP -6 6 -6 6 FOOBAR>;"TRY THIS IT IS PRETTY"$
<SFXYP -6 6 -6 6 FOOBAR () 37>;"THIS IS FOR AN IMLAC"
EX4.1.2
<SFXYP -6 6 -6 6 FOOBAR () 100>
;"THIS WILL PLOT FOOBAR ON A 100X100 GRID."
4.2 MIJPL
THIS FUNCTION TAKES AN N BY M MATRIX AND DOES A SURFACE PLOT WITH
HIDDEN LINE ELIMINATION. BY MATRIX I MEAN AN OBJECT OF THE FORM
<VECTOR [REST <VECTOR [REST <OR FIX FLOAT>]>]>. THE INNER VECTOR
IS THE ROW OR X AXIS OF THE PLOT. THE OUTER VECTOR WOULD BE THE
COLUMNS OR THE Y DIRECTION OF THE PLOT. IF YOU DON'T UNDERSTAND
WHAT I SAID LOOK AT THE EXAMPLES OR READ DECL SYNTAX (I THINK ITS IN
.INFO.). IF YOU STILL DON'T ASK ME FOR HELP. THE Z IS THE VALUE OF THE
MATRIX ELEMENT. THE CALL TO MIJPL LOOKS LIKE
<MIJPL .MATRIX .DSK .FILE>.
ALL BUT THE FIRST ARGUMENT ARE OPTIONAL. MATRIX IS THE TYPE OF MUDDLE
OBJECT THAT I WAS JUST TALKING ABOUT. DSK CAN BE AN ATOM OR FALSE, ITS
DEFAULT IS FALSE. IF DSK IS TRUE THEN MIJPL WILL PUT ITS OUTPUT ON
DISK (AS I SAID BEFORE IT IS MUCH BETTER TO MAKE AN MCELL OUT OF IT
AND PPRINT IT OUT). IF YOU DO THIS YOU CAN LOOK AT THE PLOT WITH
DSKIMAGE. FILE IS A STRING THAT IS THE NAME OF THE DSKFILE YOU WANT.
IT DEFAULTS TO <SNAME>;M3D MIGPUT.
EX 4.2.1
<SET MAT [ [1 1 1 1 1 1 1 1 1]
[1 3 3 3 3 3 3 3 1]
[1 3 9 9 9 9 9 3 1]
[1 3 9 27 27 27 9 3 1]
[1 3 9 27 81 27 9 3 1]
[1 3 9 27 27 27 9 3 1]
[1 3 9 9 9 9 9 3 1]
[1 3 3 3 3 3 3 3 1]
[1 1 1 1 1 1 1 1 1]]>;"THIS IS WHAT I MEANT BY MATRIX"$
<MIJPL .MAT>$ ;"I DON'T KNOW WHAT THIS LOOKS LIKE BUT IT MIGHT BE
INTERESTING. <1<1 .MAT>> IS THE POINT THAT IS CLOSEST TO YOU AND
THE FARTHEST TO THE LEFT."$
PAGE 18
4.3 M3D AND M3DSK
THESE TWO FUNCTIONS DO THE ACTUAL HIDDEN LINE ELIMINATION FOR SFXYP
AND MIJPL. M3D SENDS ITS OUTPUT TO YOUR TERMINAL AND M3DSK OUTPUTS
TO A DSK FILE. BOTH FUNCTIONS HAVE THE SAME FIRST ARGUMENT MATRIX.
THIS IS A VECTOR OF VECTORS OF TYPE FIX.THE VALUES OF THE FIXES
SHOULD BE FROM 0 TO 420, OR YOU WILL DRAW THE BEAM OFF THE SCOPE
AND WEIRD THINGS WILL HAPPEN. THE CALL TO M3D LOOKS LIKE
<M3D .MATRIX>
WHERE MATRIX IS THE MUDDLE OBJECT I DESCRIBED ABOVE. THE CALL FOR
M3DSK IS
<M3DSK .MATRIX .FILE>
FILE IS AN OPTIONAL ARGUMENT THAT DEFAULTS TO <-SNAME->;M3D MIGPUT
. BE CAREFUL IF YOU GIVE IT A FILE NAME BUT NO SNAME IT WILL
USE WHAT EVER '<SNAME>$' WILL RETURN. DSKIMAGE CAN BE USED TO VIEW THE
FILE ON YOUR TERMINAL
EX 4.3.1
<SET I -1>
<SET FOO
<IVECTOR 60
<IVECTOR 60
'<FIX <+ 200
<* 175 <SIN <* %</ 6.28 60>
<SET I <+ .I 1>>>>> >> >>>>
;"THIS WILL BUILD THE MATRIX"$
<M3D .FOO>$
EX 4.3.2
<M3DSK .FOO "ZORCH;GLEEP 1">;"THIS WILL WRITE OUT WHAT M3D DREW IN
THE ABOVE EXAMPLE TO DSK:ZORCH;GLEEP 1"$
<DSKIMAGE "ZORCH;GLEEP 1">;"THIS WILL DISPLAY IT ON YOUR
TERMINAL"$
PAGE 19
CHAPTER 5
THE DISPLAY COMPILER AND PROCESSOR
THIS IS THE PART OF MIGS THAT MAKES IT DIFFERENT FROM THE AVERAGE
GRAPHICS PACKAGE. BY USE OF THE SOFTWARE DISPLAY COMPILER AND PROCESSOR
MIGS CAN EMULATE MANY OF THE FEATURES OF THE E&S LDS-1.ONCE ONE HAS
DEFINED A PICTURE OR MCELL AS I CALL IT, YOU CAN TRANSLATE IT, ROTATE
IT, SCALE IT, AND MAKE UP YOUR OWN TRANSFORMS TO APPLY TO THE MCELL IN
2 OR 3 SPACE. ALSO ONCE DEFINED AN MCELL CAN BE USED AS A
SUBPICTURE IN ANY OTHER MCELL. THIS SUBPICTURING AND TRANSFORMING
CAN BE CARRIED OUT TO ANY LEVEL. THAT IS EXCEPT INFINITE(WHICH WOULD
GIVE MUDDLE A BAD STOMACH ACHE, SO MIGS DOESNT LET YOU DO THAT.). THIS
FEATURE IS GOOD FOR CATCHING INFINITE RECURSION, THAT HAPPENED BY
MISTAKE.THE ONLY REAL LIMIT OF WHAT YOU CAN DO WITH MIGS IS YOUR IMAGINATION.
NOTICE THAT IN THIS SECTION OF THIS MANUAL, YOU DON'T HAVE TO
WORRY ABOUT DRAWING OFF OF THE VISIBLE PART OF THE SCREEN, WHEN USING
THE DISPLAY COMPILER. THAT IS BECAUSE THE INTERNAL (SOFTWARE)
CLIPPING-DIVIDER TAKES CARE OF ANYTHING THAT ISN'T VISIBLE. ALSO ALL OF
THE TWO DIMENSIONAL PRIMITIVES WILL HANDLE THREE DIMENSIONAL DATA
CORRECTLY. WHEN USING THE DISPLAY COMPILER THE ARGUMENTS TO THE
PRIMITIVES CAN BE FIXED OR FLOATS.
5.1 MCELL
THE FUNCTION MCELL MAKES AN MCELL (PICTURE) FOR YOU AND THEN RETURNS
"DONE". THIS WILL SOON BE CHANGED TO THE ATOM LESS TRAILER, WHOSE LVAL
IS THE MCELL THAT WAS JUST CREATED.
MCELLS ARE HIDDEN ON THE OBLIST MCELLS(THE-NAME-YOU-GAVE-IT!-MCELLS).
LET ME EXPLAIN THE CALL TO MCELL AND IT WILL BECOME CLEAR HOW TO USE IT.
<MCELL NAME () () .DIMENSION .BLANK <-BODY-> >
NAME IS THE ATOM WHOS PNAME IS THE NAME OF THE MCELL TO BE CREATED.
THE NEXT TWO ARGUMENTS DON'T DO ANYTHING YET ,BUT THEY BETTER BE THERE OR ELSE
ERROR. THERE HAVE TO BE LISTS (AT THE PRESENT TIME EMPTY ONES ARE FINE).
ONE OF THE LISTS WILL MOST PROBABLY BE THE COLOR OF THE MCELL, WHEN
COLOR GRAPHS TERMINALS BECOME AVAILABLE.
DIMENSION IS A TRUE(ATOM) OR FALSE. IF IT IS TRUE THEN THE MCELL IS
THREE DIMENSIONAL, IF IT IS FALSE THE MCELL IS TWO DIMENSIONAL. BLANK
IS A TRUE OR FALSE. IF IT IS TRUE THE MCELL WILL NOT BE VISIBLE WHEN
YOU DISPLAY IT.
BODY IS THE MOST INTERESTING ARG TO THIS FUNCTION. IT CAN BE ANY MUDDLE
OBJECT OR OBJECTS. MCELL REALLY DROPS INTO ITS OWN EVAL(LIKE THE ONE THAT
YOU ARE IN, WHEN IN THE NORMAL MUDDLE READ EVAL PRINT LOOP.)
IN THIS ENVIRONMENT ALL THE MIGS PRIMITVES PUT THEIR OUTPUT INTO THE
MCELL. BECAUSE OF THIS IT'S A GOOD IDEA TO HAVE SOME MIGS PRIMITIVES IN
THE BODY OF THE CALL TO MCELL, OR YOU WILL GET AN MCELL WITH NO DATA IN
IT.
PAGE 20
EX 5.1.1
<MCELL TRIP () () 3D <>
<REPEAT ((8PI <* 8.0 3.14159>)
(T .8PI)
(DT </ 50.0 .8PI>)
(SF </ 500.0 .8PI>))
<CALL C <ROTZ <- .T>>
<XLATE <* .SF .T <COS .T>>
<* .SF .T <SIN .T>>
<- 10000 <* 20 .SF .T>> >>
<COND (<L? <SET T <- .T .DT>> 0> <RETURN T>)> >>
<MCELL C () () 3D <>
<CUBE -50 -50 -50 50 50 50>>;" I KNOW THAT THIS EXAMPLE
IS HARD TO UNDERSTAND, BUT I WILL EXPLAIN IT IN THE REST OF THE
CHAPTER. I WANTED TO SHOW OFF SOME OF THE POWER OF MCELL. I AM
ASSUMING THAT RRS;TEST GRAPHS HAS BEEN FLOADED."$
EX 5.1.2
<MCELL TRIANGLE () () <> <>
<MOVE 0 0>
<DRAW 600 500>
<DRAW 400 650>
<DRAW 0 0> >;"THIS WILL CREATE AN MCELL CALLED TRIANGLE, WITH A
TRIANGLE IN IT.
NOTE THAT IT IS TWO DIMENSIONAL NOT LIKE THE LAST
ONE"
IT ISN'T NECESSARY TO UNDERSTAND WHAT I AM GOING TO SAY NEXT TO BE
ABLE TO USE THE DISPLAY COMPILER AND PROCESSER. FOR THE HACKERS THAT
WANT TO KNOW WHAT AN MCELL(MUDDLE OBJECT) IS I'LL DESCRIBE IT NOW.
AN MCELL IS AN OBJECT OF PRIMTYPE LIST AND TYPE MCELL.
THE DECL FOR IT IS
<LIST LIST
LIST
[2 <OR ATOM FALSE>]
[REST <LIST FIX [REST <OR FIX FLOAT FORM ATOM>]>] >.
THE FIRST FIX IN <2<2<5 .DECL>>> IS THE OP-CODE FOR THE DISPLAY
PROCESSOR. THE REST OF IT IS DEPENDENT ON THE OP-CODE AND WHETHER IT
IS A 2 OR 3 DIMENSIONAL MCELL.
SOME OF THE OP-CODES ARE GIVEN BELOW
OPCODE MNEMONIC
____________________
0 MOVE
1 DRAW
-1 CALL
2 SETPROJ
3 SETORG
4 SETCLIP
5 PAGE
6 HCOPY
7 DASH-ON
8 DASH-OFF
PAGE 21
EX 5.1.3
IF YOU ARE STILL INTERESTED HERE IS WHAT MCELL MADE FOR TRIP AND C
<SET TRIP!-MCELLS
'#MCELL (()
()
3D
#FALSE ()
(-1
C!-MCELLS
<ROTZ -25.132719>
<XLATE 500.0 -0.10440012E-1 0.0000000>)
(-1
C!-MCELLS
<ROTZ -24.630065>
<XLATE 429.38532 -236.06818 200.0>)
.
.
.
(-1
C!-MCELLS
<ROTZ -0.11920928E-5>
<XLATE 0.23715954E-4 0.28271621E-10 9999.9995>))>
<SET C!-MCELLS
'#MCELL (()
()
3D
#FALSE ()
(0 -50 -50 -50)
(1 -50 50 -50)
(1 50 50 -50)
(1 50 -50 -50)
(1 -50 -50 -50)
(0 -50 -50 50)
(1 -50 50 50)
(1 50 50 50)
(1 50 -50 50)
(1 -50 -50 50)
(0 -50 -50 -50)
(1 -50 -50 50)
(0 -50 50 -50)
(1 -50 50 50)
(0 50 50 -50)
(1 50 50 50)
(0 50 -50 -50)
(1 50 -50 50))>
NOW THAT YOU KNOW WHAT A MCELL IS, I SHOULD SHOW WHAT TO DO ONCE
YOU MAKE ONE.
PAGE 22
5.2 DISP
THIS FUNCTION IS USED TO DISPLAY AN MCELL. BESIDES DISPLAYING AN MCELL
YOU CAN APPLY ALL THE TOP LEVEL TRANSFORMS YOU WANT. I WILL TALK
ABOUT TRANSFORMS A LITTLE LATER IN THIS MANUAL, SO BEAR WITH ME A
LITTLE LONGER. THE INCANTATION FOR DISP IS
<DISP <-MCELL-> <-TRANS1-> ... <-TRANSN->>.
<-MCELL-> IS THE PNAME OF THE ATOM ,LESS TRAILER (!-MCELLS),
WHOS LVAL IS THE MCELL. <-TRANS1-> THROUGH <-TRANSN-> ARE THE OPTIONAL
TRANSFORMS TO APPLY TO THE MCELL.
EX 5.2.1
<DISP TRIANGLE>;"THIS WILL DISPLAY THE 2 DIMENSIONAL TRIANGLE I MADE
WHEN I WAS DISCUSSING THE MCELL FUNCTION. NOTICE THAT I
DIDNT HAVE TO TELL DISP THAT IT WAS 2D, BECAUSE THAT
INFORMATION IS CONTAINED IN THE MCELL."
EX 5.2.2
<PAGE>;"CLEAR THE SCREEN"$
<DISP TRIANGLE <ROTZ %</ 3.14159 4>>>;"DISPLAY THE TRIANGLE AGAIN,
BUT ROTATE IT 45 DEGREES"$
EX 5.2.3
<REPEAT ((T 0.0) (DT </ 6.28 20.0>) (2PI 6.28))
<PAGE>;"CLEAR THE SCREEN"
<SLEEP 2>;"WAIT"
<DISP TRIANGLE <ROTZ <SET T <+ .T .DT>>>>;"DISPLAY IT AND
ROTATE IT BY
T+DT."
<SLEEP 2>;"SLEEP FOR 2 SECONDS,SO YOU CAN LOOK AT IT."
<COND (<G=? .T .2PI> <RETURN "DONE">)>>;"IF T<= 2PI THEN
DO IT AGAIN"
EX 5.2.4
<DISP TRIP <ROTY </ 3.14159 2>><XLATE 500 350 50>>;"
DISPLAY THE 'TRIP' MCELL THAT WE MADE EARLIER. ROTATE IT ABOUT THE
Y AXIS AND TRANSLATE IT TO 500,350,50."$
5.3 CALL
CALL IS THE FUNCTION THAT ONE WOULD USE TO INVOKE A SUBPICTURE(ANOTHER
MCELL),WHILE YOU ARE CREATING AN MCELL. THE USE OF CALL IS VERY
SIMILAR TO DISP, EXCEPT IT IS USED IN AN MCELL. THE MCELL THAT YOU CALL
DOESNT HAVE TO BE DEFINED, UNTIL YOU DISPLAY THE MCELL THAT THE CALL IS IN.
THE APPLICATION OF CALL LOOKS LIKE
<CALL <-MCELL-> <-TRANS1-> ... <-TRANSN-> >.
WHERE <-MCELL-> IS THE ATOM (LESS TRAILER) WHOS LVAL IS THE MCELL YOU
WANT. <-TRANS1-> THROUGH <-TRANSN-> ARE THE OPTIONAL TRANSFORMS TO
APPLY TO THE MCELL.
PAGE 23
EX 5.3.1
<MCELL GLEEP () () <> <>
<CALL TRIANGLE >;"CALL TRIANGLE WITH NO TRANSFORMS"
<CALL TRIANGLE <XLATE 300 10>>;"CALL TRIANGLE AND TRANSLATE IT
300 ,10 SCREEN UNITES."
<CALL TRIANGLE <XLATE -300 -325>;"MOVE IT AROUND THE ORIGIN"
<SCALE .25 .25>;"MAKE IT 1/4 THE SIZE "
<ROTZ %</ 3.14159 6>>;"ROTATE IT 30 DEGREES"
<XLATE 300 200>;"MOVE IT TO 300,200">>$
<DISP GLEEP>;"LETS SEE IT"
5.4 XLATE
THIS IS THE START OF WHERE I WILL DESCRIBE THE TYPE OF TRANSFORMATIONS
THAT YOU CAN APPLY TO AN MCELL, SO I BETTER DESCRIBE THE TRANSFORMATION
SYSTEM THAT I USE. THE METHOD, THAT I USE, IS HOMOGENEOUS
COORDINATES. IF YOU AREN'T SURE WHAT THAT IS I WOULD RECOMMEND THAT
YOU READ ABOUT IT IN PRINCIPLES OF INTERACTIVE COMPUTER GRAPHICS BY NEUMAN
AND SPROULL. FOR A 3D POINT I USE A FOUR ELEMENT ROW VECTOR. A
2D POINT IS A THREE VECTOR. THE LAST ELEMENT IN THE VECTOR IS THE
SCALE FACTOR, WHICH MIGS ALWAYS KEEPS EQUAL TO ONE.
A TRANSFORM IS A 4X4 MATRIX FOR A THREE DIMENSIONAL POINT, AND A
3X3 MATRIX IF THE POINT IS 2D. THE VECTOR IS ALWAYS ON THE LEFT SIDE
OF THE MATRIX DURING MULTIPLICATION. MATRICES ARE CONCATENATED BY
MY MATRIX MULTIPLIER FOR COMPOUND TRANSFORMATIONS. THE COMPOUND
TRANSFORMATIONS ARE SAVED ON AN INTERNAL STACK IN MIGS, SO THEY
DON'T HAVE TO BE RECALCULATED WHEN YOU POP UP A LEVEL IN SUBPICTURES.
THIS WAS MEANT FOR THE HACKER THAT WAS INTERESTED IN HOW MIGS HANDLED
THIS.YOU DON'T HAVE TO PAY ANY ATTENTION TO THIS IF YOU ARE
JUST INTERESTED IN USING MIGS TO DRAW PRETTY PICTURES.
XLATE IS THE TRANSFORM THAT YOU USE TO MOVE THE DISPLAY OF AN
MCELL TO A DIFFERENT LOCATION ON THE SCOPE. XLATE LIKE ALL OF
THE TRANSFORMS CAN BE USED IN DISP TO CAUSE A TOP LEVEL TRANSFORM
TO BE APPLIED TO THE MCELL( PICTURE ), OR IN A CALL TO A SUBPICTURE.
THE CALL TO XLATE LOOKS LIKE
<XLATE .X .Y>
FOR A TWO DIMENSIONAL MCELL. FOR A 3D MCELL IT IS
<XLATE .X .Y .Z>.
THE ARGUMENTS CAN BE FIX OR FLOAT. ACTUALLY ANYTHING THAT
EVALS TO A FIX OR FLOAT. X IS THE HORIZONTAL DISPLACEMENT AND
Y IS THE VERTICAL. Z IS ONLY USED IN 3D MCELLS. IT IS THE DISPLACEMENT
INTO AND OUT OF THE SCREEN. ITS DEFAULT VALUE IS 0 (REMEMBER PLUS
Z IS INTO THE SCREEN).
PAGE 24
EX 5.4.1
<DISP TRIP <XLATE 500 400 25>>;"DISPLAY TRIP AND MOVE ITS CENTER
TO 500,400,25. THAT IS THE CENTER
OF THE SCREEN AND 25 UNITS IN
TO IT"$
<MCELL BLECH ()()<><> ;"MAKE A 2D MCELL"
.
.
.
<CALL TRIANGLE <XLATE -100 300>>>;"CALL AND TRANSFORM THE
SUBPICTURE TRIANGLE"$
5.5 SCALE
SCALE DOES EXACTLY WHAT ITS NAME IMPLIES. YOU CAN ADJUST THE X,Y,
AND Z SIZE OF AN MCELL TO ANYTHING YOU WANT. IF ONE OF THE
SCALE FACTORS IS LESS THAN ONE THEN THE MCELL IS SQUASHED ALONG
THAT AXIS. IF IT IS GREATER THAN ONE THEN THE MCELL IS EXPANDED
ALONG THAT AXIS. IF THE SCALE FACTOR IS ONE THEN NOTHING IS DONE.
THE CALL TO SCALE LOOKS LIKE <SCALE .X .Y .Z>. WHERE X IS THE X
COMPONENT OF THE SCALE FOR THE MCELL TO BE DISPLAYED.THE Y AND Z
COMPONENTS ACT
LIKE THE X COMPONENT BUT ARE FOR THE Y AND Z AXIS. Z IS USED IF THE
MCELL IS THREE DIMENSIONAL. X,Y, AND Z CAN BE ANYTHING THAT
EVALS TO A FIX OR A FLOAT. IF Y OR Z ISN'T GIVEN THEY WILL DEFAULT
TO THE VALUE OF X. IF Z IS GIVEN IN A 2D MCELL IT IS IGNORED.
EX 5.5.1
<DISP TRIANGLE <SCALE .5>>;"DISPLAY THE TRIANGLE AGAIN, BUT
SCALE THE WHOLE WORLD TO ONE HALF ITS SIZE"
5.6 ROTZ
THIS TRANSFORM IS USED TO ROTATE AN MCELL ABOUT THE Z OF THE SCOPE.
BECAUSE THE POSITIVE Z AXIS POINTS INTO THE SCREEN A POSITIVE
ROTATION MOVES CLOCKWISE. THE ARGUMENT TO ROTZ IS IN RADIANS AND
MUST BE OF TYPE FLOAT. ROTZ IS THE LAST OF THE TRANSFORMS ,SO FAR
LISTED THAT WILL WORK ON TWO OR THREE DIMENSIONAL MCELLS. THE CALL
TO ROTZ IS <ROTZ .T>, WHERE THE LVAL OF T IS A FLOAT.
EX 5.6.1
<DISP TRIANGLE <XLATE -300 -325>;"CENTER IT AT THE ORIGIN."
<ROTZ %</ 3.14159 4>>;"ROTATE IT 45 DEGREES"
<XLATE 500 400>;PUT IT AT THE CENTER OF THE SCREEN">$
PAGE 25
5.7 ROTX
ROTX IS QUITE SIMILAR TO ROTZ, EXCEPT THAT IT ONLY WORKS ON THREE
DIMENSIONAL MCELLS. ROTX WILL ROTATE AN MCELL ABOUT THE X AXIS. ITS
ARGUMENT IS A FLOAT WHO IS THE ANGLE IN RADIANS THAT YOU WANT TO
ROTATE THE MCELL BY.
5.8 ROTY
THIS TRANSFORM IS IDENTICAL TO ROTX AND ROTZ, BUT IT PERFORMS THE
ROTATION ABOUT THE Y AXIS. AGAIN ROTY'S ARGUMENT IS OF TYPE FLOAT
AND IS THE ANGLE IN RADIANS. AT THIS TIME YOU SHOULD BE ABLE TO
UNDERSTAND EXAMPLE 5.1, THE TRIP MCELL.
5.9 CREATING YOUR OWN TRANSFORMS
A TRANSFORM IS A FUNCTION OR RSUBR THAT RETURNS A 3X3 MATRIX IF
IT IS A 2D MCELL OR A 4X4 MATRIX IF ITS A 3D MCELL. THE DATA STRUCTURE
FOR THIS MATRIX IS
#DECL ((MATRIX) <VECTOR FIX FIX <VECTOR [REST FLOAT]>>).
THE TWO FIXES ARE THE DIMENSION OF THE MATRIX. THE FLOATS ARE THE
MATRIX ELEMENTS.
I WILL NOW GIVE TWO EXAMPLES THAT WILL MAKE WHAT I JUST SAID
MUCH CLEARER. THE FIRST ONE IS THE XLATE TRANSFORM IN MIGS.
EX 5.9.1
<DEFINE XLATE (X1 Y1 "OPTIONAL" (Z1 0.0)
"AUX" (X <FLOAT .X1>)
(Y <FLOAT .Y1>)
(Z <FLOAT .Z1>))
<COND (<1 .3DSK!-DISPCOM> ;"TRUE IF THE MCELL 3D"
[4 4 [1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
.X .Y .Z 1.0]])
(T ;"MUST BE 2D"
[3 3[1.0 0.0 0.0
0.0 1.0 0.0
.X .Y 1.0]])>>
FOR THE SECOND EXAMPLE I WILL PRESENT THE ZOOM TRANSFORM. THIS
TRANSFORM ONLY WORKS ON 3D MCELLS. IT IS THE ONE THAT I
FORGOT WHEN I WROTE MIGS.
EX 5.9.2
<DEFINE ZOOM (ZF) ;"MAKE LIKE A ZOOM LENS"
[4 4[1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 </ 1.0 .ZF>
0.0 0.0 0.0 1.0]]>
PAGE 26
5.10 SETCLIP
THIS FUNCTION IS USED TO SET THE WINDOW FOR THE CLIPPING-DIVIDER.
THE CLIPPING-DIVIDER WILL SOON BE CHANGED TO FIX A KNOWN BUG,
IF THE OBJECT IS BEHIND YOU IT WILL TURN INSIDE OUT AND BE VISIBLE ON
THE SCREEN. SO WHEN THE CLIPPING-DIVIDER IS FIXED, SETCLIP WILL MOST
LIKELY BE CHANGED. THEREFORE, THIS DESCRIPTION IS ONLY TEMPORARY.
THE CALL TO SETCLIP IS
<SETCLIP .LX .RX .BY .TY>$.
ALL OF THE ARGUMENTS ARE OPTIONAL. IT DEFAULTS A WINDOW THAT IS THE BOX
[0,0 0,1023 1023,1023 1023,0]. LX IS THE LEFT LIMIT, RX IS THE RIGHT
LIMIT, BY IS THE BOTTOM OF THE VISIBLE SCREEN, AND TY IS THE TOP.
EX 5.10.1
<SETCLIP 0 1023 0 1023> ;"THE ORIGIN IS AT THE LOWER LEFT CORNER
AND THE WINDOW IS THE WHOLE SCREEN"$
<SETCLIP -510 510 -510 510> ;"THE ORIGIN IS AT THE CENTER OF THE
SCREEN AND THE WINDOW IS THE WHOLE
SCREEN"$
PAGE 27
APPENDICIES
A.1 SOME EXAMPLES OF THE USE OF MIGS PRIMITIVES
A.1.1
<DEFINE SPIRAL ("AUX" A B T X Y) ;"THIS IS THE CLASSIC SPIRAL PROGRAM.
IT USES THE PARAMETRIC EQUATION:
(X,Y)=(T*COS(T),T*SIN(T))"
<REPEAT ((A <RANDOM 3927>))
<PAGE>
<SLEEP 2>
<SET A </ <RANDOM> 1000000.0>>
<SET A <* <SIN .A> 314.15900>>
<SET B <- 0.0000000 .A>> ;"DELTA T IS PICKED AT RANDOM"
<SET T <IUVECTOR 100 '<SET B <+ .B .A>>>>
<SET X <MAPF ,UVECTOR #FUNCTION ((T) <* .T <COS .T>>) .T>>
<SET Y <MAPF ,UVECTOR #FUNCTION ((T) <* .T <SIN .T>>) .T>>
<SET A
<MAX !<MAPF ,UVECTOR ,ABS .X!> !<MAPF ,UVECTOR ,ABS .Y!>>>
<PLOTV <MAPF ,UVECTOR
#FUNCTION ((X) <FIX <+ 501 <* .X </ 400 .A>>>>)
.X>
<MAPF ,UVECTOR
#FUNCTION ((Y) <FIX <+ 401 <* .Y </ 400 .A>>>>)
.Y>> ;"PLOTV IS USED TO PLOT THE PATTERN"
<SLEEP 5>>>
A.1.2
<DEFINE THIS ()
<THAT 0 0 1020 0 1020 1020>
<THAT 1020 0 1020 1020 0 1020>
<THAT 1020 1020 0 1020 0 0>
<THAT 0 1020 0 0 1020 0>
<THAT 510 0 510 510 1020 510 25>
<THAT 510 1020 510 510 1020 510 25>
<THAT 510 1020 510 510 0 510 25>
<THAT 510 0 510 510 0 510 25>>
<DEFINE THAT (X1 Y1 X2 Y2 X3 Y3 "OPTIONAL" (INK 51) "AUX" X1I X2I Y1I Y2I)
";THAT DRAWS A HYPERBOLA AS A RULED SURFACE"
<SET X1I </ <- .X2 <FLOAT .X1>> .INK>>
<SET Y1I </ <- .Y2 <FLOAT .Y1>> .INK>>
<SET X2I </ <- .X3 <FLOAT .X2>> .INK>>
<SET Y2I </ <- .Y3 <FLOAT .Y2>> .INK>>
<LINE3D .X1 .Y1 0 .X2 .Y2 0>
<REPEAT ()
<COND (<L? <SET INK <- .INK 1>> 0> <RETURN ,NULL>)>
<LINE3D <SET X1 <+ .X1 .X1I>>
<SET Y1 <+ .Y1 .Y1I>> 0
<SET X2 <+ .X2 .X2I>>
<SET Y2 <+ .Y2 .Y2I>> 0>>>
PAGE 28
A.2 EXAMPLES OF THE DISPLAY COMPILER AND PROCESSOR
A.2.1 THIS EXAMPLE CREATES AN OBJECT (I CALL POLY-THING) AND THEN
ROTATES AND DISPLAYS IT.
<MCELL P0 ()()3D<> ;"HAS A HEXAGON CENTERED ON 3 LINES THAT ARE
PERPENDICULAR TO EACH OTHER."
<CIRCLE 0 0 50 6>
<LINE -45 0 45 0>
<LINE 0 45 0 -45>
<LINE 0 0 -45 0 0 -45>> ;"LINE WHEN USED IN THE DISPLAY COMPILER
CAN BE USE FOR 2 OR 3 DIMENSIONS"
<MCELL P1 ()()3D<> "MAKE A DUMBBELL OUT OF TWO HEXAGONS AND A LINE"
<CALL P0 <XLATE 0 0 100>>
<LINE 0 0 100 0 0 -100>
<CALL P0 <XLATE 0 0 -100>>>
<MCELL P2 ()()3D<> ;"STICK THREE DUMBELLS TOGETHER TO MAKE A POLY-THING"
<CALL P1 <ROTX 1.57>>
<CALL P1 <ROTY 1.57>>
<CALL P1>>
<SETORG 0 0>;"IF YOU ARE ON AN IMLAC"
<SETPROJ 0 0 855>
<SETCLIP -510 510 -510 510>;"MOVE THE ORIGIN TO THE CENTER OF THE SCREEN"
<DEFINE RPT () ;"ROTATE AND DISPLAY THE P2 MCELL OR POLY-THING"
<REPEAT ((I .1) (X 0.0)
<SLEEP 2>
<DISP P2 <SCALE 2><ROTX .X><ROTY <* 1.4 .X>>>
<COND (<G? <SET X <+ .X .I>> 6.28> <RETURN FOOBAR>)>
<SLEEP 3>
<PAGE>>>$
PAGE 29
 ;"STICK THREE DUMBELLS TOGETHER TO MAKE A POLY-THING"
<CALL P1 <ROTX 1.57>>
<CALL P1 <ROTY 1.57>>
<CALL P1>>
<SETORG 0 0>;"IF YOU ARE ON AN IMLAC"
<SETPROJ 0 0 855>
<SETCLIP -510 510 -510 510>;"MOVE THE ORIGIN TO THE CENTER OF THE SCREEN"
<DEFINE RPT () ;"ROTATE AND DISPLAY THE P2 MCELL OR POLY-T