CFFK@MIT-MC 07/02/81 17:37:35 To: BDB at MIT-MC CC: PLOT2 at MIT-MC OK here is a description of REPLOT(XXX); REPLOT is an FEXPR which means that LISP does NOT evaluation its args. REPLOT does it when it thinks it should. The plots that REPLOT plots are given by the following list: If atom(xxx) then (if listp(ev(xxx)) then ev(xxx) else [xxx]) else (if listp(xxx) then xxx else [xxx]); Thus FOO:BAR; REPLOT(FOO); replots FOO not BAR. Also note that subscripts get an extra evaluation so that REPLOT(PLOT[FOO]); replots PLOT[BAR] not PLOT[FOO]. Thus if you have a sequence of plots to be named and replotted, do P():=(For i thru 10 do (... , nameplot(PLT[i]))); RP():=For i thru 10 do replot(PLT[i]); If you need the extra evaluation on the atoms do: APPLY(REPLOT,[FOO]); (which replots BAR.) So you might have wanted RP(name):=APPLY('REPLOT,[name]); But RP(PLT[i]) will still not work. (Mainly because the plot is stored as the VALUE of the array element and the Macsyma simplifier which knows nothing about plots munges it badly when the arg to RP gets evaluated. This is not a problem with atoms because the plot is then stored on the property list of the atom.) All rather muddling. It might have been a good idea to stay clear of FEXPRs. They always cause confusion sooner or later. In any case, the reason for the behavior you see is buried in that If atom(xxx)... stuff above (if you think about it.)  Date: 1 APR 1981 1530-EST From: CFFK at MIT-MC (Charles F. F. Karney) Subject: Contours going through grid points. To: MJA at MIT-MC CC: PLOT2 at MIT-MC What I do is to pretend that grid points with Z=0 actually are Z=0+. This allows me to uniquely determine which cells the contour goes through. Logically the contours no longer can go through the grid points (although the intercept of the contour with the side of the cell will of course coincide with one of the grid points). The only time when the position of the contours is effected by this scheme is when there is a flat region (e.g. when neighboring grid points have Z=0). But then the contour is ill-defined anyway. Your handling of saddle points seems OK, although I'm note sure I understand how you compute the value of the middle of the cell. I take the mean of the 4 corners. But just about anything will work as long as the value is invariant to rotation of the cell.  Date: 27 MAR 1981 0923-EST From: CFFK at MIT-MC (Charles F. F. Karney) To: MJA at MIT-MC CC: PLOT2 at MIT-MC The ref is The computer journal vol 15 num 4 p 382 (1972). (This appears half way through PLOT3D just before the definition of the contour plotting functions.) Sorry I'm don't think I know what you mean by a nodal surface. But I can explain what CONTOURPLOT2 does. You give it a 2D array of points (normally a cartesian array but it can be e.g. in polar coords). Consider 4 neighboring points of the array which are at the 4 corners of a rectangle. CONTOURPLOT2 breaks this rectangle up into 4 triangles by inserting a central point which is the mean of the 4 corners. The entire surface may be considered as a polyhedron made up of triangular faces. CONTOURPLOT2 then calculates the exact contours for this polyhedral surface. Special fixes are put in to resolve ambiguities when some faces are horizontal. As far as I can remember the idea of inserting the central point was mine. The ref I gave didn't do this which meant that which way the contour turned when entering a rectangle containing a saddle point was ill-defined. This could have lead to crossing contours. If you like you can mail me an array of numbers and I try CONTOURPLOT2 out on them and mail (by US mail) the results to you. I believe that all the funny cases can be tried out with small arrays (5 x 5 or so). Macsyma on a TOPS-10. Forget it, at least for the time being. You need a lot of memory which is not usually available on TOPS-10 systems. The MACSYMA group is gearing up to license use of Macsyma on VAXes and maybe some other DEC systems. In addition a special purpose computer is being built (for about $60k ?) which will run Macsyma (this is the LISP machine). You can get more details from JM if you are interested.  Date: 17 February 1981 21:11-EST From: James E. O'Dell To: CFFK at MIT-MC cc: PLOT2 at MIT-MC Date: 17 February 1981 08:34-EST From: Charles F. F. Karney To: JIM cc: PLOT2 I moved the special declarations out of $LABEL. I'm afraid I don't know anything else you have to do to make PLOT2 work on Multics. Maybe I will be able to fix things if you do have problems though. Thanks a lot. I'll let you know how it works. The Multics code looks very straightforward so.....  CFFK@MIT-MC 02/17/81 08:34:49 To: JIM at MIT-MC CC: PLOT2 at MIT-MC I moved the special declarations out of $LABEL. I'm afraid I don't know anything else you have to do to make PLOT2 work on Multics. Maybe I will be able to fix things if you do have problems though.  CFFK@MIT-MC 02/13/81 08:58:09 To: PLOT2 at MIT-MC namefile now returs the truename of its arg.  Date: 12 FEB 1981 1523-EST From: CFFK at MIT-MC (Charles F. F. Karney) Subject: PLOT2 working again. To: INFO-PLOT2 at MIT-MC Thanks to GJC, PLOT2 is working once more.  Date: 12 FEB 1981 1232-EST From: CFFK at MIT-MC (Charles F. F. Karney) To: INFO-PLOT2 at MIT-MC I've managed to break PLOT2. TEKPLT FASL won't load up. The older versions of TEKPLT also don't work. Should be fixed by the end of today. Sorry for inconvenience.  CFFK@MIT-MC 12/18/80 17:23:32 Re: Expansion of previous message. To: EISLER at MIT-MC CC: JPG at MIT-MC, PLOT2 at MIT-MC Suppose you have 3 arrays Z[I,J], X[I], and Y[J] and you want a contour plot with I going from 0 to IM and J from 0 to JM. (1) Declare X and Y by ARRAY(X,FLOAT,IM) and ARRAY(Y,FLOAT,JM) (before fill the arrays up). (2) Define a function ZF(XV,YV):=Z[LOOKUPX(XV),LOOKUPY(YV)]; LOOKUPX(XV):=FOR I FROM 0 THRU IM DO IF X[I]=XV THEN RETURN(I) ELSE FALSE; and similarly for LOOKUPY. (3) CONTOURPLOT2(ZF(XV,YV),XV,X,YV,Y); This should do what you want. Let me know if it works OK.  CFFK@MIT-MC 12/18/80 08:40:29 Re: GRAPH3D(..., CONTOUR); To: EISLER at MIT-MC CC: JPG at MIT-MC, (BUG PLOT2) at MIT-MC, PLOT2 at MIT-MC No, this is not meant to work. The problem is that the CONTOUR plotter requires a 2*2 matrix of values to work on. (I.e. if the x-values are xi and the y-values are yj, there must be a z(i,j) for all i and j. Within this rstriction CONTOURPLOT2 allows you to be fairly general so that the xi and yj need not be uniformly spaced and you are allowed to specify a transformation from one set of (x,y) to another so that the plotted region need not be rectangular. I don't think the PLOT2 USAGE is misleading: it says that contour plots are available by PLOT3D(..., CONTOUR) and CONTOURPLOT2. Maybe it should explicity exclude GRAPH3D? Certainly GRAPH3D(..., CONTOUR) should fail more gracefully.  GJC@MIT-MC 10/25/80 15:05:53 To: CFFK at MIT-MC CC: PLOT2 at MIT-MC Yes, that stuff was dis-installed, it was taking up core and didn't seem to be too popular. A more general way of collecting that kind of information may be put into macsyma, so thats why the special case was taken out of PLOT2. If anyone depends on the time-check, feature then please tell me.  CFFK@MIT-MC 10/25/80 14:55:55 To: GJC at MIT-MC CC: PLOT2 at MIT-MC It looks as though your TICKS_PER_WARNING stuff in PLOT2 has been dis-installed. Is that right? There's no mention of such an action in PLOT2 RECENT.  Date: 6 OCT 1980 0814-EDT From: CFFK at MIT-MC (Charles F. F. Karney) To: YAU at MIT-MC CC: JIM at MIT-MC, PLOT2 at MIT-MC Sorry, there's no easy way to get the tickmarks for log plots arranged as they would be on log-log graph paper. They would be fairly easy to put in by hand with GRAPH2([.1,.2,.3,...,1,2,3,...,10,20,30,..], [0,.1,0,.1,0,.1....],LOG,SAME)$ (You would have to turn of the regular tickmarks of course, and you should specify FIRST in the ordinary call to PLOT2, and you may want to fiddle around with XMAX and XMIN etc.)  CFFK@MIT-MC 09/12/80 10:26:09 Re: 3D surfaces specfied parametrically To: CMA at MIT-MC CC: JPG at MIT-MC, PLOT2 at MIT-MC No, there is no easy way of getting this done. You'll have to somehow convert your data to the form Z(X,Y). (Maybe numerically.) [If the transformation between (A,B) and (X,Y) is well-behaved, it's possible you can manage to do something using the user-defined transformation capability. But you'll have to factor in the 3-D transformation also. See PLOT2 USAGE for details.]  JEHUDA@MIT-MC 08/24/80 11:41:38 To: PLOT2 at MIT-MC BUGE. I get a printplot on a TK4025 term. insted of a good plot like on a TK4010. Can you fix this ? Thankyou JEHUDA.  CFFK@MIT-MC 08/16/80 16:14:48 To: CMA at MIT-MC CC: PLOT2 at MIT-MC, (BUG GLP) at MIT-MC The problem is that the resolution of the XGP is slightly different in the horiz and vertical directions. (One is 192/inch and the other is 200/inch. I forget which is which. Actually the horiz resolution is NOT constant across the page, as you may have noticed.) There is no provision is PLOT2 for allowing for this difference (partly to maintain an easy conversion between plots produced for the XGP, Gould printer (which has the same vert. and horiz. resolutions) and Tektronixes). As a temporary fix I suggest you manually adjust the WINDOW and XMAX etc. to give yourself the scaling you want. The best place to make a more permanent fix would be in the Gould spooler (which is the program that produces the scan files for the XGP). There is already a provision in the spooler for blowing up a plot by a constant scale factor (PLOTSCALE, I believe it's called). So it shouldn't be too difficult to make the scales different in the two directions.  CFFK@MIT-MC (Sent by CFFK0@MIT-MC) 08/14/80 23:32:35 To: ADK at MIT-MC, PLOT2 at MIT-MC I have changed PLOT2 to send out 1 secs worth of padding characters after a screen clear on a tektronix. You should now have no problems with part of your plot disappearing. (You must ensure that ITS knows your speed. Check it by doing :TCTYP DES and change it by doing e.g. :TCTYP SPE 1200 .)  Date: 24 JUN 1980 1614-EDT From: GJC at MIT-MC (George J. Carrette) To: INFO-PLOT2 at MIT-MC CC: JPG at MIT-MC, GJC at MIT-MC In the interests of helping people to get their work done faster a time monitoring feature has been added to PLOT2. The variables TICK_TIME_UNIT_IN_SECONDS and TICKS_PER_WARNING control how often an efficiency checking function is run during the evaluation of the functions given to PLOT2. This function checks to see if code can be translated, checks translated code for efficiency (proper MODEDECLAREs), and checks compiled code for the amount of flonum and other consing it is doing. It prints out helpful information. If you are doing things optimaly you will never notice it of course. N.B.=> this uses the TIME alarmclock. Presently only one time alarmclock can be running at the same time, this will be fixed in the future though. -gjc  CFFK@MIT-MC 04/19/80 13:34:05 Re: CONTOURPLOT2 To: RHB at MIT-MC CC: PLOT2 at MIT-MC 1) If CONTOURPLOT2 sees a constant level, C, and it tries to plot a contour at height, C, then you can think of CONTOURPLOT2 as changing the contour height to C+eps, where eps is a small positive (or is it negative?) number. THereafter no special actions are taken to handle constant areas. The contours are determined by linear interpolation between neighboring points. In order to resolve the difficulty caused by saddle points an additional point is computed at the center of each rectangle (this is just taken as the mean of the values at the corners of the square). Then additional points on the contours are obtained along the diagonals of each rectangle. In this way the plane is tiled by triangles, and there are no problems with saddle points. 2) With the checkerboard pattern of points, you get either smoothed squares or diamonds depending on whether the contour level is higher or lower than the new point introduced in the center of each rectangle. 3) You can't really govern where the contour labels go. If you want you can use the corsshairs on the tektronix of position your labels where you want them. Or else you can try to compute where the contours are yourself. If you want something ready for publication, then set LABELCONTOURS:FALSE$ and then get the draftmen to label your contours for you. (They can then take care of labelling only certain of the contours, blanking out the contours where the labels are, writing the labels parallel to the contours, and other fancinesses.) 4) The precision of the contour labels is governed by PLOTNUMPREC. Try PLOTNUMPREC:2$ (This governs the prec of all numbers written by PLOT2.) You might also try CONTOURS:'INTEGER$ or CONTOURS:[0,4,6]$ to stop rounding errors from causing the levels to be odd numbers like 3.999. 5) I believe something like: (ZMAX:10.5,ZMIN:-.5,CONTOURPLOT2(....,FIRST), ZMAX:20.5,ZMIN:10.5,REPLOT(TRUE,[1],SAME,LAST)); will do what you want. You may have to fiddle with the ZMAXs and ZMINs a bit. You might be safer doing CONTOURS:[0,1,2,3...,10] etc. [CONTOURPLOT2([one thing, other thing],....[0,1])$ plots the contours for one-thing solid, and for other-thing dashed. That's not what you want however.] (Addendum to (3): See documention on EDIT in PLOT2 USAGE for how to use the cross-hairs on the Tektronix.)  Date: 31 MAR 1980 0943-EST From: CFFK at MIT-MC (Charles F. F. Karney) Subject: How to COMPILE functions which call PLOT2 etc. To: INFO-PLOT2 at MIT-MC GJC has asked me to explain the how's and why's of compiling functions which call PLOT2 and friends. It is possible to correctly compile such functions. However it requires some extra work on the part of the user. (TRANSLATing, on the other hand, shouldn't cause any problems.) The problem with COMPILing functions that reference PLOT2 is that PLOT2 evaluates its arguments in a special way. In order for PLOT2 to be able to do this the compiler must be told that the variables PLOT2 references are SPECIAL. (Otherwise the compiler is liable to put the variables in some odd place like a push-down list, which PLOT2 knows nothing about.) Thus to compile the function P(A,B):=PLOT2(F(X),X,A,B)$ insert the following declarations P(A,B):=(DECLARE([X,A,B],SPECIAL),PLOT2(F(X),X,A,B))$ Then do COMPILE(P)$ Notes: That's DECLARE and not MODEDECLARE. This is a misfeature which will hopefully be fixed shortly by the maintainers of TRANSLATE/COMPILE. It isn't really necessary to declare the X to be SPECIAL. That happens anyway, since as far as P is concerned X is a global variable. It's always OK to declare a variable SPECIAL. However compiled code involving lots of SPECIAL variables is orders-of-magnitude slower than the same code without any SPECIAL variable. This means that that you should try and split up your program so that the lengthy calculations are done in a function which doesn't call PLOT2 and so which doesn't need to reference special variables. The function which calls PLOT2 should be very simple so that you don't care whether the compiled version is very efficient or not. (Indeed, you perhaps should not bother compiling such a function at all. E.g. there is negligible speed-up gained in running the function P above when compiled.) It should be possible for the COMPILE command to insert nearly all the SPECIAL declarations itself (leaving only some unusual cases which need individual attention). Maybe this will happen some day. But don't hold your breath.  CFFK@MIT-MC 03/28/80 19:31:05 To: PLOT2 at MIT-MC, HEDI at MIT-MC CC: RYD at MIT-MC PLOT2 supports output to the Versatec (for users at PPL). The allowable PLOTMODEs for specifying this are V, VERSY, and VERSATEC. As far as PLOT2 goes this is exactly the same as PLOTMODE:XGP$ except that when a HARDCOPY is requested the GLP spooling program is told to do an OUTPUT:VERSATEC (instead of OUTPUT:XGP). Ask me for details of how to move the files created by GLP over to PPL and how to get them plotted. [RYD: If you have 100 dot/inch Versatecs at LASL it would be fairly easy to get the plots out on them.]  GJC@MIT-MC 03/24/80 04:24:02 To: CFFK at MIT-MC, CL at MIT-MC, JPG at MIT-MC, JLK at MIT-MC I changed NAMEPLOT and PLOT2P and others in the file CFFK;APLOT2 so the NAMEPLOT() would not use the value cell to store the plot, if is an atom. If is an array, then it still works the same as always. If you are curious as to where I put the plot, I did ($PUT '$PLOT) which is as good a place as any. By the way, NAMPLOT(FOO) didn't used to work with *RSET T. because quote-subs used to do (MEMQ 'ARRAY (CDAR FOO)). This can cause real trouble, because the CDAR of a symbol is a list whos CDR is the VALUE of the symbol, which might be a list containing the atom ARRAY. I checked out TEKPLT and PLOT3D, and did not find any other places in the code that depended on the fact that the plot was stored in the value cell of the symbol, so I installed it on SHARE. -gjc  CFFK@MIT-MC 03/12/80 15:44:33 DEH wants to be able to plot characters instead of symbols. Maybe there should be a switch saying to use the character which is normally substituted for the symbol in PLOTMODE(P)$ In the meantime, this is what I told him: CFFK@MIT-MC 03/12/80 14:06:21 Re: Labelling with letters. Here's how to do it. (Not very beautifully I'm afraid.) Supposing you have a curve F(X) you want plotted between X0 and X1, and you want it marked at either end with an "A", then you would do: (PLOT2(F(X),X,X0,X1,FIRST), ENTERGRAPH(), FOR X IN [X0,X1] DO GHPRINT("A",?TEK\-X(X),?TEK\-Y(F(X)),1), CLEAR:WAIT:TRUE, EXITGRAPH())$ The extension to many curves should be obvious. The functions GHPRINT, ?TEK\-X, etc. are documented in SHARE;PLOT2 USAGE if you need to know more about what's going on. Let me know whether this works (it should, but I haven't tried it). I've put you request to allow alphabetic symbols on my list of things to do. However since it may not get done for a month or two, the above should serve.  Date: 1 MAR 1980 1205-EST From: CFFK at MIT-MC (Charles F. F. Karney) Subject: LABEL vs. CONCAT To: INFO-PLOT2 at MIT-MC I notice a lot of people using CONCAT for a plot label, when LABEL would do the job easier. Instead of doing: PLOT2(...., FALSE,FALSE,CONCAT("A=",A," B=",B,...))$ do: PLOT2(...., FALSE,FALSE,LABEL(A,B,...))$ This will make a title "A=5 B=3.14 ..." (or whatever). Full description of LABEL can be found in SHARE;PLOT2 RECENT message of 12/29/77.  Date: 1 MAR 1980 1126-EST From: CFFK at MIT-MC (Charles F. F. Karney) Subject: NAMEPLOT(PLT[J]) To: INFO-PLOT2 at MIT-MC CC: GJC at MIT-MC GJC has pointed out that some people do things like: APPLY('NAMEPLOT,[CONCAT("PLT-",J)]), and that such constructions will no longer work once double-quoted strings evaluate to themselves (and thus become unassignable). The way to get around this problem is to say: NAMEPLOT(PLT[J]) (as in the previous case J is evaluated). (In any case the latter form is preferable, since it is shorter and clearer.)  BROWN@MIT-MC 01/22/80 12:20:32 To: PLOT2 at MIT-MC DO YOU SUPPORT THE HP 2647A INTELLIGENT GRAPHICS TERMINAL? ALSO HOW ABOUT THE TEKTRONIX 4051?-I AM GOING TO BUY ONE OR THE OTHER BUT LIKE THE HP BETTER IF IT IS SUPPORTABLE  Date: 12 DEC 1979 1904-EST From: CFFK at MIT-MC (Charles F. F. Karney) To: INFO-PLOT2 at MIT-MC PLOT2 now works for Tektronix 4025 terminals. The way to do this is to set PLOTMODE:'TEK$ TEK4025:TRUE$ and then PLOT2( ... ) or whatever. The Tektronix 4025 is supported by :CRTSTY TK4025. The terminal has to be told to expect the regular Tektronix graphics that is used by the Tektronix 4010 terminal. How this is done is described below by KAT. In the 4025 the screen is split into two regions, the work space and the monitor. The monitor is the space that communicates with the host unless the host is transmitting graphics, in which case the graphics goes to the work space. The user has to specify the size of the work space (which specifies the size of the monitor by giving it whats left) and defining the a graphics region in the work space. To have the 4025 accept 4010 graphic an additional commmand is needed, the shrink command. So to get the 4025 to do 4010 graphics the following TEK comands are needed (` is the command character that crtsty uses to communicate with the terminal): `wor n (where n is the size of the workspace I use n=20 which leaves 13 lines for the mon. `graphic 1,35 (this makes the graphic region occupy the first 35 lines of the workspace, the args to graphic can define the grahics to be anywhere in the workspace as long as it defines 35 lines cause that is the size of the 4010 graphics region- ie graphic 35,69 would be fine. this does not bother the fact that the workspace is 20 since the picture can be scrolled into veiw, the wor command just defines the size of the visible portion of the workspace `shrink (this tells the 4025 to behave like the 4010) I think that the above three commands are best done by the users because 1) the `wor command also has the effect of erasing the workspace and the monitor which might not be desired. 2) the size of the monitor depends on whether the user needs to see a lot of the host interaction or is just executing plots.  Date: 15 NOV 1979 1727-EST From: CFFK at MIT-MC (Charles F. F. Karney) To: INFO-PLOT2 at MIT-MC The way SAVEPLOTS chooses its defaults has changed. If the first arg. to SAVEPLOTS is a list, then it is merged in with the current file defaults to obtain the full filespec. (This is th same as before.) However if the first arg. is not a list then the filespec. used is [PLOTS,>,''DEVICE,''UNAME]. (This will normally be [PLOTS,>,DSK,uname]. DEVICE and UNAME are also used by SAVE in a similar manner.) SAVEPLOTS always sets the file defaults.  CFFK@MIT-MC 09/26/79 21:59:39 To: KMP at MIT-MC CC: PLOT2 at MIT-MC I am using PLOTMODE(P)$ |But that shouldn't make any difference.  Date: 7 AUG 1979 1544-EDT From: CFFK at MIT-MC (Charles F. F. Karney) Subject: CALCOMPNUM changed to PLOTNUM To: INFO-PLOT2 at MIT-MC The variables CALCOMPNUM, CALCOMPNUM0, and CALCOMPNUM1 have been renamed PLOTNUM, PLOTNUM0, and PLOTNUM1. (Supposedly more sensible names.) In order to assist in the changeover, an attempt to set one of the old variables will print a warning message, and then set the new variable. (Thus CALCOMPNUM:100$ PLOTNUM; ==> 100 . But note that PLOTNUM:20$ CALCOMPNUM; ==> 100 still.) Both PLOT2 USAGE and PLOT2 DEMO have been changed appropriately.  Date: 28 JUL 1979 1752-EDT From: CFFK at MIT-MC (Charles F. F. Karney) Subject: WORLDPLOT To: INFO-PLOT2 at MIT-MC The data files for WORLDPLOT have been restored from the Datacomputer, so WORLDPLOT should work once more.  Date: 4 MAY 1979 1236-EDT From: CFFK at MIT-MC (Charles F. F. Karney) Subject: Using PLOT2 through CRTSTY To: INFO-PLOT2 at MIT-MC, INFO-CRTSTY at MIT-MC PLOT2 (Macsyma's plotting package) should now work through CRTSTY when PLOTMODE:'DISPLAY$ Please let me know if there are any problems.  Date: 29 MAR 1979 0459-EST From: JONL at MIT-MC (Jon L White) Subject: Yet another COMPLR bug bites the dust! To: JLK at MIT-MC, SK at MIT-MC, CFFK at MIT-MC CC: JONL at MIT-MC, INFO-PLOT2 at MIT-MC, (BUG COMPLR) at MIT-MC Well, there was this obscure compiler bug evident only in the case of LESSP with more than 2 args and with verrry special conditions. That's why poooor FFORMA hasn't been compiled for more than three years. But all is well now. Hopefully! Just in case there are other cases of FFORMA that lose under the current compiler, the age-old version is on AI:LIBLSP;FFORMA OFASL  Date: 28 MAR 1979 1538-EST From: JONL at MIT-MC (Jon L White) Subject: FFORMA To: JLK at MIT-MC CC: CFFK at MIT-MC, SK at MIT-MC, INFO-PLOT2 at MIT-MC, JONL at MIT-MC I have retrieved the FASL from a few days ago - for whatever reason, the FASL coming from the current compiler for this file (LIBDOC;FFORMA >) has some terrible bug in it. As of yet, I'm not sure why, whether it is because there is some change in the source language over the pas five years (FFORMA was written in 1974), or whether there is an insidious bug in the compiler. My apologies for the inconvience this has caused.  Date: 27 MAR 1979 1611-EST From: JLK at MIT-MC (John L. Kulp) To: JONL at MIT-MC CC: CFFK at MIT-MC, INFO-PLOT2 at MIT-MC LIBLSP;FFORMA is broken. It seems to multiply things randomly by 6. The PLOT2 package in MACSYMA depends on this for doing labeling of plots. Please fix asap. Thanks.  Date: 25 FEB 1979 1419-EST From: JLK at MIT-MC (John L. Kulp) To: R11-USERS at MIT-MC CC: INFO-PLOT2 at MIT-MC The default for PLOTSCALE in MACSYMA and for ARDS plots printed using :GLP is now 1.0 rather than 1.75 or something random. Also, there is more documentation under :INFO GLP about using the Gould with the new spooler.  CFFK@MIT-MC 12/15/78 09:09:48 Re: XGPSAVE To: KMP at MIT-MC CC: JPG at MIT-MC, (FILE [SHARE;PLOT2 RECENT]) at MIT-MC This has been flushed, as noted in SHARE;PLOT2 RECENT. It has been superceded by PLOTMODE(XGP)$ PLOT2(...)$ HARDCOPY()$ (or linefeed if you are also plotting on the terminal). (This queues the file for you.) Alternatively you can do NAMEFILE(filename)$ and at a later time do HARDCOPY([filename],XGP)$ Let me know if you have problems.  CFFK@MIT-MC 08/26/78 22:43:58 To: INFO-PLOT2 at MIT-MC You have been selected for inclusion in the INFO-PLOT2 mailing list. Here is the most recent message. If you do not wish to be on this mailing list, remove your name from the file, CFFK;PLOT2 LIST, or send a not via :BUG PLOT2 CFFK@MIT-MC 08/26/78 22:08:23 Re: CONTOURPLOT2 To: INFO-PLOT2 at MIT-MC [1] The way the contour levels are chosen when CONTOURS is an integer has been changed. [a] If CONTOURS is a positive integer (the default value is 20), then approximately CONTOURS contours will been drawn and the levels will be "nice" values. ("Nice" means in multiples of a*10^n, where "a" is 1, 2, or 5. The levels are computed by the same function that determines where to put the tick marks on the axes.) [b] If CONTOURS is a negative integer then ABS(CONTOURS) evenly spaced contours will be drawn. In this case the levels will be at "nasty" values, and you may want to set LABELCONTOURS to FALSE, to suppress the printing of long numbers on the contours. (This is what used to happen with postive CONTOURS.) [2] An additional small change is that PLOT2 knocks a trailing ".0" off the numbers it prints. Thus you get e.g. "Xmin = 2 ..." instead of "Xmin = 2.0 ...". Is this the right thing to do?  CFFK@MIT-MC 08/26/78 22:08:23 Re: CONTOURPLOT2 To: INFO-PLOT2 at MIT-MC [1] The way the contour levels are chosen when CONTOURS is an integer has been changed. [a] If CONTOURS is a positive integer (the default value is 20), then approximately CONTOURS contours will been drawn and the levels will be "nice" values. ("Nice" means in multiples of a*10^n, where "a" is 1, 2, or 5. The levels are computed by the same function that determines where to put the tick marks on the axes.) [b] If CONTOURS is a negative integer then ABS(CONTOURS) evenly spaced contours will be drawn. In this case the levels will be at "nasty" values, and you may want to set LABELCONTOURS to FALSE, to suppress the printing of long numbers on the contours. (This is what used to happen with postive CONTOURS.) [2] An additional small change is that PLOT2 knocks a trailing ".0" off the numbers it prints. Thus you get e.g. "Xmin = 2 ..." instead of "Xmin = 2.0 ...". Is this the right thing to do?  CFFK@MIT-MC 05/12/78 17:44:09 This feature was put in long ago, but never got documented somehow. There is a flag PLOT2ERROR, which governs what happens when PLOT2 hits an error in trying to evaluate a point. If PLOT2ERROR is TRUE (the default) an error occurs and PLOT2 exits. However if DEBUGMODE is TRUE you can ask for the value of PLOT2ERROR which is temporally bound to the form being evaluated when the error occurs. If PLOT2ERROR is a floating point number then that number will be used as the value of the erroneous form. Proposed extension: If PLOT2ERROR is FALSE then the value of PLOT2UNDEFINED is used as the value of the erroneous point. (An error if PLOT2UNDEFINED isn't a number.)  BEE@MIT-MC 05/12/78 07:45:11 To: INFO-PLOT2 at MIT-MC There is a new feature for two-dimensional graphs in PLOT2. These are plots produced by PLOT2, PARAMPLOT2, and GRAPH2. If the function that is being plotted returns the value PLOTUNDEFINED, then that point will not be plotted at all, and the line will be discontinuous. This is to implement inhibition of plotting in areas of discontinuities, or where the function is undefined. This will be extended to plot3D and contourplot2 as soon as I can figure how to do it.  CFFK@MIT-MC 03/05/78 12:58:20 Re: For interest only! May be ignored. To: INFO-PLOT2 at MIT-MC The temporary .PLOT. files that are needed when pltting on the Gould or XGP, are now put on the .TEMP. directory (instead of the user's own directory or USERS;). This change made so that old files do not stay around longer than necessary (.TEMP.; gets reaped whenver the system comes up). This change should not affect anyone's use of PLOT2.  CFFK@MIT-MC 01/30/78 23:39:44 To: PLOT2 at MIT-MC, (BUG PLOT2) at MIT-MC, GRS at MIT-MC To: PEREIR at MIT-MC, MEISS at MIT-MC There is a flag called CRCLEAR whose default value is TRUE, meaning PLOT2 should clear the screen on receipt of a carriage return. If you need to disable this do CRCLEAR:FALSE$ (LBL guys must do this when going through their machine since all their lines are terminated by returns.)  CFFK@MIT-MC 01/06/78 12:19:42 Re: LOGLOG, TOP, BOTTOM, LEFT, RIGHT To: INFO-PLOT2 at MIT-MC There are 5 new keywords that can appear in the optional args to PLOT2, GRAPH2, REPLOT etc. 1) LOGLOG. This is the same as the keyword LOG (and gives you a LOG-LOG plot.) 2) TOP, BOTTOM, LEFT and RIGHT. These govern where in your plotting window the plot will actually appear. E.g. TOP and LEFT mean put the plot in the top left corner, BOTTOM means in the bottom half of the window, RIGHT in the right half, etc. These flags are non-sticky, meaning that REPLOT doesn't remember them, although it recognizes them. The gap left between the plots you get using these flags is PLOTGAP, which has a default value of 20. Example: (PLOT2(X,X,0,1,TOP,FIRST),PLOT2(1-X,0,1,BOTTOM,LAST))$ PLOT2(SIN(X),X,-%PI,%PI,DONT)$ REPLOT(TRUE,TOP,LEFT)$ /* replots in top left corner */ REPLOT()$ /* replots in the whole window */ REPLOT4 could be defined by: REPLOT4(PL1,PL2,PL3,PL4):=BLOCK([DATEPLOT:FALSE,DP:DATEPLOT,PLOTGAP:20], REPLOT(PL1,TOP,LEFT,FIRST), BLOCK([DATEPLOT:DP], REPLOT(PL2,TOP,RIGHT)), REPLOT(PL3,BOTTOM,LEFT), REPLOT(PL4,BOTTOM,RIGHT,LAST))$ Note the flag SAME means to keep the same window as well as the same scale. Thus SAME overrides these flags. If you want to preverse the scale, the thing to do is to do all the plots but the first inside a BLOCK([YMAX:YMAX1,YMIN:YMIN1,XMAX:XMAX1,XMIN:XMIN1], .... )  CFFK@MIT-MC 12/29/77 21:42:44 Re: Improved (I hope) handling of labels. To: INFO-PLOT2 at MIT-MC The action PLOT2 takes when it comes across something which could be a label in the optional arguments list of a plotting function is as follows: If it is (a) an atom, (b) of the form 'FOO or '(...), (c) of the form EV(...) or CONCAT(...) or LABEL(...), then the label gets evaluated, else it is used literally. (Previous it only got evaluated in case (a).) Notes: (1) The evaluation of 'FOO is FOO for all FOO, so if you want to get a label of FOO and FOO has a value use 'FOO. ("FOO" also works in most instances.) (2) There is a new function LABEL which is a hairy label maker for PLOT2. It takes any number of arguments and returns an atom containing the arguments concatenated together. It differs from CONCAT in the following respects: (i) It sticks spaces between the items. (ii) The arguments needn't be atoms. (iii) if an argument is of the form 'FOO, then FOO appears in the result. (iv) Otherwise it evaluates the arguments. Then if the evaluation is different from the argument = appears in the result, else just . (v) In (iv) if is a floating point number then only PLOTNUMPREC sig. figs. of it appear in the answer. (3) LABEL is spelt "LABEL" not "LABLE". (4) The label is evaluated inside an ERRCATCH, so if you have an error in the evaluation of your label, you will see an error message, but the plot will still come out (with no label where you goofed). Example: PHASE:EV(%PI,NUMER)$ AMPLITUDE:2$ PLOTNUMPREC:5$ PLOT2(SIN(X)+A,X,0,2*%PI,LABEL(AMPLITUDE,PHASE))$ produces a plot with an XLABEL of "AMPLITUDE=2 PHASE=3.1416" If LABEL doesn't do the right thing in your opinion, now is the time to complain. For instance there is no way to get just in the result of LABEL. If you can think of a way to do this, let me know. What about commas in place of spaces?  BEE@MIT-MC 12/29/77 17:22:17 To: INFO-PLOT2 at MIT-MC The bug causing betas to appear on plots should be fixed.  JLK@MIT-MC 12/20/77 16:55:05 To: INFO-PLOT2 at MIT-MC The FASL files for the PLOT2 package have been renamed. Basically the NFASL files are now FASL, and the FASL files are OFASL. For the moment, links exist from the NFASL files to FASL but these will be flushed eventually. Please update your init files, etc.  CFFK@MIT-MC 12/17/77 21:38:54 Re: Minor improvements To: INFO-PLOT2 at MIT-MC [1] LOADPLOTS prints "FOO PLOTS being loaded" only if LOADPRINT is TRUE or LOADFILE. [2] REPLOT if it has to load the plot from a file will only say so if LOADPRINT is TRUE or AUTOLOAD. [3] The Macsyma simplifier leaves PLOTS alone. Thus it is possible to rename plots by FOO:BAR$ (assuming BAR is a PLOT). This is not a recommended practise however, since FOO will not be on the PLOTS list, and KILLPLOTS(BAR) will also kill FOO (since they share the same storage).  BEE@MIT-MC 12/03/77 11:35:48 To: INFO-PLOT2 at MIT-MC It is now impossible to have both plotmode as XGP and GOULD at the same time. Before this used to be necessary to get plots for the XGP. Now plotmode(XGP) is exactly like plotmode(GOULD) except that the output goes to the XGP instead. This might cause some errors in batch files of people who used to say plotmode(X,G) or something like that.  BEE@MIT-MC 12/01/77 14:12:34 To: INFO-PLOT2 at MIT-MC A new tekplt package has been installed. The new package has some variables renamed for consistency. This is a listing of the variables that have changed. Old variable New variable What it does -------------------------------------------- GOULDTHICK PLOTTHICK controls how thick the lines are on XGP or GOULD plots GOULDSCALE PLOTSCALE controls the scaling of a plot on XGP or GOULD XGPLFTMAR PLOTLFTMAR controls the lftmar on plots XGPBOTMAR PLOTBOTMAR controls the bottom margin on plots These should be the only changes visible.  JLK@MIT-MC 11/21/77 17:05:07 To: INFO-PLOT2 at MIT-MC Does anyone use the XGPSAVE command? If so, you most likely want to be using PLOTMODE(XGP,...) instead. In any case, I am considering changing it to use the same format used by GOULD plots (i.e. it will no longer use the XP program). If there is a demand for it, the old style XGPSAVE command may be kept around as OLDXGPSAVE. It might be more useful to have a command called XGPFILE which takes a file saved by NAMEFILE and prints it on the XGP. GOULDFILE would be good too. Then there would be no need for XGPSAVE. Comments?  BEE@MIT-MC 11/05/77 15:09:05 To: INFO-PLOT2 at MIT-MC PLOT2 now outputs plots directly to the XGP, as mentioned in a previous message. There are two new variables XGPLFTMAR and XGPBOTMAR. These adjust the bottom margin and leftmargin for the XGP plots. These default to a value such that the plots will fit comfortably on an 8 1/2 x 11 page.  JLK@MIT-MC 11/04/77 17:38:07 To: INFO-PLOT2 at MIT-MC There is now a simpler way to get plots out on the XGP (and they look better). Simply do PLOTMODE(XGP, ...) where ... is the correct plot mode for your terminal (i.e. GR for Grinnell TV's, T for Tektronix, or D for character display terminals like VT52's). Then you can use linefeed at the end of the display of a plot, or HARDCOPY(); to cause a hardcopy to be submitted to the XGP (it is processed by the Gould spooler first). If AI is up and the queuing for the XGP is successful, you will receive a message from the XGP spooler when your plot is printed. If AI is down, your plot will be processed into an XGP scan file, .GLPT.; > SCN, and the Gould spooler will send you a warning message telling you that AI is down. You must copy the SCN file to AI yourself when AI comes up and queue it by doing :XGP ;SCAN AI:dir;* SCN where dir is the directory on AI to which you copied the files (use MACSYM; if you don't know of any other directory to use). If you use the NAMEFILE command instead of HARDCOPY or linefeed, you can print the plot file later by doing :GTPL dir;fn1 fn2/a/o[x] when dir, fn1, fn2 are the directory, first file name, and second file name of the plot file stored with NAMEFILE. XGPSAVE may be flushed in the future if there is no further demand for it.  CFFK@MIT-MC 10/18/77 23:10:32 Re: MINOR CHANGE TO REPLOT4 To: INFO-PLOT2 at MIT-MC REPLOT4 ONLY PUTS THE DATE ON THE TOP RIGHT PLOT (ASSUMING DATEPLOT: TRUE$) THE EXCEPTION IS IF YOU ONLY ASK REPLOT4 TO PLOT 1 PLOT (BY GIVING IT ONLY 1 ARGUMENT) IN WHICH CASE THE DATE GOES ON THAT PLOT.  JLK@MIT-MC 10/12/77 12:45:42 Re single date for REPLOT4, it would also be nice to have a single title as well (of course it doesn't make much sense to allow single x and y labels, but allowing both individual and overall titles would be nice).  JLK@MIT-MC 10/11/77 23:00:55 To: (BUG PLOT2) at MIT-MC It would be nice if there were a way to get a single DATE printed out on REPLOT4 plots, rather than having it redundantly printed 4 times, once on each plot. A single date in the upper right would suffice. CFFK@MIT-MC 10/05/77 21:49:10 To: EAK at MIT-MC CC: PLOT2 at MIT-MC, CBF at MIT-MC THE SLEEP PRIOR TO THE OUTPUT OF THE ENTER GRAPHICS COMMAND HAS BEEN CHANGED TO AN OUTPUT OF 2 SPACES.  CFFK@MIT-MC 09/22/77 20:57:21 To: EAK at MIT-MC CC: PLOT2 at MIT-MC, JLK at MIT-MC Well I've implemented the stop and start sequences for your tektronix. You should do PLOTMODE(TEK) (assuming that isn't already the default) and TEK4662:TRUE$ (this can be doen at any time). Could you give it a try? I have no way of checking it where I am.  JLK@MIT-MC 08/31/77 23:53:16 To: INFO-PLOT2 at MIT-MC The bug were echoing of type-in gets permanently turned off, has hopefully been fixed. This happened only when your MACSYMA was continued while the plot was being computed (I.e. the TTY returned to DDT). If further occurrances are observed, please send bug mail.  CFFK@MIT-MC 07/14/77 11:32:54 Re: PLOT2 in NEWIO MACSYMA To: INFO-PLOT2 at MIT-MC I've encountered a couple of bugs with the NEWIO version of PLOT2. Both are fixed now. Be on the lookout for others and let me know of them as soon as possible.  CFFK@MIT-MC 06/18/77 21:38:24 Re: Pattern generation using Fast Fourier Transforms To: INFO-PLOT2 at MIT-MC The following little program might amuse you. It plots pretty patterns. (LOADFILE(FFT,FASL,DSK,SHARE),LOADFILE(ARRAY,FASL,DSK,SHARE)); (ARRAY(FR,FLOAT,255),ARRAY(FI,FLOAT,255)); PP():=(FILLARRAY(FR,[0.0]),FILLARRAY(FI,[0.0]), THRU 2 DO FR[RANDOM(256)]:1.0, FFT(FR,FI), GRAPH2([FR,[FR[0],FR[255]]],[FI,[FI[0],FI[255]]])); DO PP();  CFFK@MIT-MC 06/13/77 15:35:31 To: INFO-PLOT2 at MIT-MC [1] PLOTRESET should no longer give Illegal REMVALUE attempt if e.g. YMAX has a value but is not on the VALUES list. [2] If CALCOMPNUM0 has a numeric value, then the 3D plotting functions (PLOT3D, CONTOURPLOT2) will use that value instead of CALCOMPNUM. The default is for CALCOMPNUM0 to be unbound; thus it is compatible with the old scheme. [3] Quitting in the middle of a plot resets CLEAR and WAIT to TRUE; thus when quitting from inside a multiple plot [PLOT2(..., FIRST), ... , PLOT2(..., LAST)], you will not be left in an abnormal state.  CFFK@MIT-MC 06/13/77 11:52:43 To: INFO-PLOT2 at MIT-MC PLOT2 tries not to change the DDT defaults for ^F and ^R (:PRINT ). Changed functions are HARDCOPY, XGPSAVE, NAMEFILE etc.  CFFK@MIT-MC 06/08/77 22:26:00 To: INFO-PLOT2 at MIT-MC APD wants to include some of the PLOT2 documentation in the new MACSYMA manual. PLOT2 USAGE is probably to long as it stands, so I would welcome suggestions as to what to include and leave out. Suggestions for examples also welcome.  JLK@MIT-MC 05/31/77 15:20:38 To: PLOT2 at MIT-MC DON'T USE REMVALUE IN PLOTRESET.  CFFK@MIT-MC 05/29/77 12:17:19 To: PLOT2 at MIT-MC Distinguish AI-TVs and Grinnells.  JLK@MIT-MC 05/18/77 16:51:18 It would be nice if at the end of a plot, typing ? gave you a little menu of options (in case you forgot). Looking breifly at PLOT2 USAGE I can see I better read over it, since there are many things there I was not aware of! (or I have forgotten about...)  cffk@MIT-MC (Sent by JLK@MIT-MC) 05/20/77 13:29:39 To: FCR at MIT-MC CC: PLOT2 at MIT-MC You could store the numbers in the lists in arrays (Use FILLARRAY in ARRAY FASL DSK SHARE). Of course it might take as long to store the numbers in the arrays, as it takes for GRAPH2 to deal with the lists. You could win better, if you stuck your data in arrays rather than lists in the first place.  cffk@MIT-MC (Sent by JLK@MIT-MC) 05/20/77 13:18:08 To: FCR at MIT-MC CC: PLOT2 at MIT-MC You mean GRAPH2([1.0,2.0 .. ], .. ); as compared with GRAPH2(, ..); Second one is a lot more effecient (of must be declared floating). If mean PLOT2(list[I],I, .. ); as compared with PLOT2(arr[I],I, .. ); then they are equally ineffecient.  CFFK@MIT-MC 05/18/77 17:00:33 To: PLOT2 at MIT-MC Can't do shading or nice numbers or writing on plot.  CFFK@MIT-MC 05/17/77 00:52:43 To: PLOT2 at MIT-MC Implement CALCOMPNUM0 for 3D plots  CFFK@MIT-MC 05/15/77 23:06:12 To: INFO-PLOT2 at MIT-MC I've rearranged the files that PLOT2 lives in. Please let me know of any problems. Those with autoload properties in their MACSYM (INIT) files: Please note that the files now live on SHARE;. Change your (INIT) files to reflect SHARE;PLOT2 LISP. There will be links on my directory to the relevent files on SHARE; for a while.  CFFK@MIT-MC 05/15/77 21:55:27 To: PLOT2 at MIT-MC fix contours to work like ticks  CFFK@MIT-MC 05/11/77 21:38:30 To: FFM at MIT-MC CC: PLOT2 at MIT-MC You can partially win on AI-TV's by doing PLOTMODE(DISPLAY,XGP); or PLOTMODE (XGP,DISPLAY); (These have slightly different meanings -- look in the document- ation, or experiment.) Then the plots will come out as crumby character plots on the TV's but internally a full resolution plot is remembered about. The beautiful full resolution plot can then be printed on the XGP by doing XGPSAVE(">",SCN,DSK,FFM); (or some other file-spec, this is recommended though) and in DDT :XGP ;SCAN MC:FFM;* (The * means all files >,SCN). (You might want to copy the files over to AI first as if MC/AI is sluggish you might get a gap in your plot.) WORLDPLOT hasn't been hacked for a long time.  CFFK@MIT-MC 03/15/77 16:36:07 What PLOT2 doen't do  BROM@MIT-MC 03/15/77 16:33:56 FIX UP THE DOCUMENTATION ABOUT ENTERGRAPH. ALSO INCLUDE SOMETHONG ABOUT SETTING THE SWITCHES CLEAR AND WAIT.  CFFK@MIT-MC 03/15/77 14:27:15 ^^ in Plot2 should reset CLEAR and WAIT.  JLK@MIT-MC 03/08/77 15:12:37 Re: PLOT2 DOCUMENTATION I have had several requests for help in generating figure quality plots for view graphs etc. If you hack PLOT2 doc for INFO you should somewhere have a section on generating specially configured plots with examples (I doubt if all this winning documentation of yours will stop people from asking questions though...) CFFK@MIT-MC 03/21/77 21:34:41 To: INFO-PLOT2 at MIT-MC The Grinnell TV's in Building 38 are now up and supported by PLOT2. The new PLOTMODE is one of GRINNELL, or GR. (E.g. PLOTMODE(G,GR); plots for the Gould and the Grinnells.) Although they only have a resolution of 512*512, all coordinates are divided by 2 before being plotted, so WINDOW etc. should be chosen as though the screen coordinates ran from 0 to 1023 each way. The default WINDOW for Grinnells is thus [0,1023,0,1023] (the entire screen). PLOT2 decides you're on a Grinnell if using the procedure described in Sec 15.3 of PLOT2 USAGE, it thinks you're an Imlac, but your page height is 46 or less. (Imlac users elsewhere: let me know if this screws you up.)  CFFK@MIT-MC 03/17/77 22:28:48 To: INFO-PLOT2 at MIT-MC A very pernicious bug has cropped up recently. Its symptoms are that after a plot, you cannot type anything to your MACSYMA, you cannot quit or anything useful like that. I am trying to find a fix for this bug, but in the meanwhile the corrective action you should take, if it strikes you is: ^Z :XFILE CFFK;PLOT2 FIX $P  CFFK@MIT-MC 03/01/77 19:04:50 Re: Major revision of the documentation To: INFO-PLOT2 at MIT-MC Do :PRINT SHARE;PLOT2 USAGE Please let me know of any inaccuracies, obscurities etc. SHARE;PLOT2 RECENT has been renamed PLOT2 ARCHIV, and a new PLOT2 RECENT started. PLOT2 DEMO has been rewritten. Old demo is still to be found (for now) in PLOT2 ODEMO.  CFK@MIT-MC 01/31/77 12:44:35 To: INFO-PLOT2 at MIT-MC CC: JPG at MIT-MC PLOT2 in OLDIO Macsyma loses because a character outputting function (TYO8) has been removed, and use of PLOT2 thoroughly screws up the Macsyma. This problem has been fixed. Ignore the message it came in.  CFK@MIT-MC 01/30/77 19:23:42 To: INFO-PLOT2 at MIT-MC CC: JPG at MIT-MC Bah! PLOT2 currently only works in NEWIO Macsyma (gotten via QA^K at present). PLOT2 in OLDIO Macsyma loses because a character outputting function (TYO8) has been removed, and use of PLOT2 thoroughly screws up the Macsyma. This bug may be fixed by the time you read this; but Beware!  CFK@MIT-MC 01/09/77 12:54:29 Re: PLOT2 in Newio To: INFO-PLOT2 at MIT-MC PLOT2 has been modified to run in Newio Macsyma (QA). The modified files are APLOT2 NFASL, TEKPLT NFASL and WORLD NFASL. SHARE;PLOT2 LISP has been altered to load these files if you're in Newio. Let me know of any problems.  CFK@MIT-MC 11/06/76 13:22:36 To: INFO-PLOT2 at MIT-MC /* MHR@MIT-AI 11/02/76 16:03:20 1) Is there a way to have the numbers which label the axes appear outside of the plotting window? Now they are intersected by the axes, and sometimes by the curves. Suppose you want do PLOT2(X,X,1,2); then you could do */ BLOCK([YMAX,YMIN,XMAX,XMIN,DATEPLOT,NOPRINT,XAXIS,YAXIS,WINDOW,OWINDOW], WINDOW:OWINDOW:[100,1023,100,790], /* allow 100 raster units for writing in later*/ DATEPLOT:XAXIS:YAXIS:FALSE, /* turn off things that print*/ NOPRINT:TRUE, PLOT2(X,X,1,2,FIRST), /* plot*/ YMAX:YMAX1,YMIN:YMIN1,XMAX:XMAX1,XMIN:XMIN1, /* save XMAX etc*/ BLOCK([XMIN,XMAX,YAXIS], /* push XMIN etc.*/ XMIN:-1,XMAX:1, WINDOW:OWINDOW+[0,0,0,0],WINDOW[1]:0,WINDOW[2]:200, YAXIS:ALL, GRAPH2([],[])), /* plot Y axis */ BLOCK([YMAX,YMIN,XAXIS], /* do same for X axis*/ YMAX:1,YMIN:-1, WINDOW:OWINDOW+[0,0,0,0],WINDOW[3]:0,WINDOW[4]:200, XAXIS:ALL, GRAPH2([],[],LAST))); /* 2) When I use dashed lines of type [7,3], the resulting dashes seem to be less straight than a corresponding solid line. Is this an artifact of the particular line type I'm using, is this an illusion, or is it because the plotting algorithm different when the lines are not solid? This is because dashed lines are implemented by drawing a sequence of small undashed lines. Since these lines are about 4 - 10 raster units long, there are only a small number of directions in which they can point, and the chances are that none of these directions coincide with the direction of the dashed line as a whole. Hence dashed lines often appear to weave about. Tektronix Users. I have recently wirtten a function that allows you to use the cross- hairs on a Tektronix. It is still in rather an embryonic stage, but you may want to try it out. To load it do: LOADFILE(EDIT,">",DSK,CFK); The main function in it is called EDIT, and its intention is to allow you to enter labels and various odd lines onto an existing plot. To use it you must have a function of no arguments, whose body is a BLOCK and the last statement in the BLOCK must be EXITGRAPH(). If the function is P(), say then P(); should plot as much of your picture as can be conveniently specified by PLOT2, GRAPH2 etc. EDIT(P); will execute P(), but will stop before the final EXITGRAPH(), and display the cross-hairs. By typing various letters EDIT will enter commands into the function P directly before the EXITGRAPH(), Allowed letters are: Rubout, exit from EDIT Space, save the location of the crosshairs S or s, enters a SETPOINT command into your function V or v, enters a VECTOR command (should be preceded by a SETPOINT or another VECTOR command) L or l, draws a line between the saved location and the crosshairs and enters it in the function. P or p, reads text from the keyboard and prints it left justified at the cursor. Echoing is suppressed while it is reading the text. Reading continues until a Carriage-Return is encountered. C or c, same as P, except the text is centered. R or r, same as P, except the text is right justified Remember that after exiting EDIT your function will have been changed, so that P(); should give you the updated PLOT. Items maybe be removed using the MACSYMA editor, or TECO. To draw a picture from scratch you could do: HOUSE():=BLOCK([],ENTERGRAPH(),EXITGRAPH()); EDIT(HOUSE); now with a sequence of S's and V's you can draw a house terminating it with a Rubout. HOUSE(); draws your house. As an example consider the following program, that plots a labeled figure. All the printing commands (GHPRINT( ... )) were entered using EDIT. (Batch this in and do P(), to see how it looks.) */ ( R : 47.5, AAA : 1.13128698, BB : 1.29027253 ); ATHRESH(NU) := BB/AAA*SQRT(ABS((NU-NU1)*SIN(%PI*NU))*R^3/NU^2); PL(NU1) := ( PLOT2(ATHRESH(NU), NU, (NU1+30)/2, NU1, SAME), PLOT2(ATHRESH(NU), NU, NU1, NU1+IF NU1 > 30 THEN 0.2 ELSE -0.2, SAME) ); NUL :[29.62,29.97,30,30.11,30.23,30.28,30.42]; ISLANDL: [1.85,.45,0,1.67,1.45,1.78,2.03]; STOCHL :[4,3.7,4,3.5,3.9,3.6,3]; PLOTMODE(G, T); BOTHCASES:TRUE; P():= BLOCK( [CALCOMPNUM, WINDOW, CLEAR, WAIT, NOPRINT, DATEPLOT, XAXIS, YAXIS, YMIN, YMAX, XMIN, XMAX], AA:7, DEFINESYMBOL(1,SQRT(2.)*[[0,AA],[0,-AA],[AA,0],[-AA,0],[0,0]]+.5), DEFINESYMBOL(2,[[AA,AA],[-AA,-AA],[AA,-AA],[-AA,AA],[0,0]]), OWINDOW:[0,1023,5,790], WINDOW:OWINDOW+[100,-20,200,-20], NOPRINT:TRUE, DATEPLOT:FALSE, TICKNUM:-[10,5], TICKSIZE:2*AA, YAXIS:TRUE, XAXIS:TRUE, YMAX:4.5, YMIN:0, XMIN:29.5, XMAX:30.5, GRAPH2([],[],FIRST), /* Plots the axes with tickmarks, but no labels */ YAXIS:XAXIS:FALSE, CALCOMPNUM:3, PLOT2(ABS(NU-30)/30*SQRT(%PI*R^3/2)*BB/AAA,NU,29.5,30.5), CALCOMPNUM:10, FOR DE IN [1/6.0,1/5.0,1/4.0,1/3.0,1/2.0,2/5.0] DO (PL(30.0+DE),PL(30.0-DE)), GRAPH2(NUL,[ISLANDL,STOCHL],[29,19]), WINDOW:OWINDOW, GRAPH2([],[]), /* This is so that the new WINDOW gets used for GHPRINT calls */ ENTERGRAPH(), CLEAR:WAIT:TRUE, /* So that the EXITGRAPH() waits and the next plot clears the screen */ GHPRINT("0",87,203,2), GHPRINT("4",87,688,2), GHPRINT("29.5",99,167,1), GHPRINT("30",553,167,1), GHPRINT("30.5",1004,167,1), GHPRINT("1",587,312,2), GHPRINT("2",986,287,2), GHPRINT("5",924,230,0), GHPRINT("3",862,230,0), GHPRINT("4",789,230,0), GHPRINT("5",742,230,0), GHPRINT("6",686,257,2), GHPRINT("a",68,447,2), GHPRINT("v",371,142,1), EXITGRAPH())$  CFK@MIT-MC 08/31/76 00:46:40 Re: Minor Change to PLOTMODE To: INFO-PLOT2 at MIT-MC PLOTMODE:[G,I]; and PLOTMODE:T; are now valid ways of doing PLOTMODE(G,I); and PLOTMODE(T); respectively. (This change is to make PLOTMODE compatible with other MACSYMA switch-like functions e.g. FPPREC.)  CFK@MIT-MC 07/31/76 15:50:08 To: WHG at MIT-MC, TBW at MIT-MC, RXG at MIT-MC, ROBT at MIT-MC, MHR at MIT-MC To: ITO at MIT-MC, FCR at MIT-MC, DBA at MIT-MC, CMA at MIT-MC, CAS at MIT-MC To: ALEPH at MIT-MC, INFO-PLOT2 at MIT-MC, MEZRAH at MIT-ML PLOT2 can be used to plot on character-only terminals. The intention is to allow a preview of output on a higher resolution device like the XGP. The relevant calls to PLOTMODE are: PLOTMODE(P); or PLOTMODE(PRINTING); for plotting on a printing terminal. PLOTMODE(D); or PLOTMODE(DISPLAY); for plotting on a terminal that allows cursor positioning These calls can, of course, be combined with X (XGP) or G (GOULD). (E.g. PLOTMODE(X,D);) Before making a call to PLOTMODE you might want to change the value of CHARRATIO (default value 1.5). This should equal the ratio of line-pitch to the character-pitch for your terminal. (This enables the EQUALSCALE:TRUE mode to work, and ensures that what you see on your screen/paper is the same shape as what will come out on the XGP.) The default line type (type 0) is drawn with .'s. The other line types (1 - 9) are drawn with other symbols (*, #, $ etc.). The symbols (specified by the tens digit of the line type) are defined by the letters (A, B, C etc.). No attempt is made to actually draw a dotted line, or a fancy symbol on the terminal (although they will come out on the XGP). Unfortunately if you choose a line type that specifies both a line and a symbol, the line will in most cases overprint and so erase the symbol. The line and symbol characters may be changed using the DEFINEDASH and DEFINESYMBOL functions, by suppliying as their second arguments, an integer (the ASCII value of the char to be used) or a character (e.g. A, "1", \$ etc. - the character itself). In order to specify no line (or no symbol) give 0 as the second argument (not space or 32, as this will cause existing lines, axes etc, to get over-written and, maybe erased, by spaces). The default line and symbol character are: 0 1 2 3 4 5 6 7 8 9 lines . * # $ % & + @ - none symbols none A B C D E F G H I Unless you set the PLOTMODE before PLOT2 is loaded, PLOTMODE gets initiallized according to LISP's TTY variable as follows: TTY PLOTMODE 0 PRINTING 1 DISPLAY (datapoint) 2 DISPLAY (datapoint) 4 TEKTRONIX 5 DISPLAY (TV. these may soon be supported) 6 PRINTING (memowreck) 7 IMLAC (if eraseable) (software tty) TEKRONIX (otherwise) 8 PRINTING (terminet) 9 DISPLAY (other display)  CFK@MIT-MC 07/05/76 12:42:03 Re: various changes to PLOT2 To: TBW at MIT-MC, RXG at MIT-MC, ROBT at MIT-MC, OVER at MIT-MC, MHR at MIT-MC To: MDT at MIT-MC, ITO at MIT-MC, FCR at MIT-MC, FBN at MIT-MC, INFO-PLOT2 at MIT-MC To: MEZRAH at MIT-ML summary: 1] more effecient evaluation of the first arg of the plotting functions 2] better scheme for naming and saving plots - NAMEPLOT, SAVEPLOTS etc. 3] REPLOT takes all the optional args PLOT2 takes, plus NONE and LIN 4] REPLOT can replot several plots, REPLOT([FOO,BAR]) 5] negative TICKNUM to stop rounding out to nearest tickmark 6] negative ranges for PLOT2 etc allowed. bigfloats allowed. 7] DONT optional arg to suppress plotting 8] DATEPLOT governs dating of plot 9] hardcopy on gould 5200 10] XGPSAVE has been split in two. 11] arbitary transformations between data points and screen points 12] polar, log-log, lin-log and log-lin plots 13] first arg to 3d plotting functions is a z coordinate 14] crosshatching implemented for 3d plots, CROSSHATCH 15] perspective view for 3d plots more general, defaults better 16] scaling for 3d plots changed 17] GRAPH3D function implemented 18] multiple contour plots are allowed 19] contours chosen differently, INTEGER value for CONTOURS 20] LABELCONTOURS governs contour labeling 21] internal scaling info available, WINDOW1, XMAX1 etc. details: 1] effecient evaluation of first arg of PLOT2, PLOT3D and of first two args of PARAMPLOT2. if what was normally the second arg to PLOT2 is missing, the first arg is treated as a function name. the function must be a function of one arg (or two args in for PLOT3D) and must be either a translated or compiled function which returns a floating point number when it is given floating point arg (or integer arg if the INTEGER arg to PLOT2 is given). this is supposed to provide a quicker evaluation of the first arg and for that reason NO checking is done on the result. if the wrong sort arg is returned, you will get garbage plotted. with PARAMPLOT2 either both the first and second args must be of this form or neither of them. examples: TRANSLATE:TRUE; F(X):=(MODEDECLARE(X,FLOAT),EXP(-X*X)); PLOT2(F,-2,2); PLOT2(F,[-2,-1,0,1,2]); ARRAY(V,FLOAT,10); FOR I FROM 0 THRU 10 DO V[I]:FLOAT(I*I); PLOT2(F,V); G(X,Y):=(MODECLARE(X,FLOAT),EXP(-X*X-Y*Y)); PLOT3D(G,-2,2,-2,2); F(X):=(MODEDECLARE(X,FLOAT),COS(X)); G(X):=(MODEDECLARE(X,FLOAT),SIN(X)); PARAMPLOT2(F,G,0,2*%PI); 2] better scheme for naming and saving plots in order the avoid the gobbling of flonum space when plots are saved, they are now saved in arrays. unfortunately this means they can no longer be saved in the normal way. this following functions manipulate saved plots: NAMEPLOT(); names the last call to one of the plotting functions . must be either an atom (e.g. FOOP) or an array element (e.g. SNOO[4]). is stuck onto the list PLOTS so it becomes for instance []. as before gets stuck on the VALUES or ARRAYS list as appropriate. typing rubout at the end of a plot causes a to get read in and NAMEPLOT applied to it. SAVEPLOTS([],,, ... ); saves the plots , etc in the file . defaulting of is traditional (e.g. FOO is the same as FOO,">"). however caution should be exercised if the second filename is ">" (see below). [] may be omitted altogether in which case the defaults (as used by e.g. LOADFILE) are used. SAVEPLOTS([],ALL); saves all the plots in PLOTS. (or else you can say SAVEPLOT([],PLOTS); ) (n.b. SAVEPLOTS may be done within a WRITEFILE, unlike for instance SAVE.) another action of SAVEPLOTS is the put the into the value of the saved plots. thus a subsequent SAVE([], FUNCTIONS,); although it wont correctly save the data in will remember what file it was saved in using the SAVEPLOTS command. SAVEPLOTS returns a list of plots it succeeded in saving KILLPLOTS(,, ... ); frees up the array storage used by etc. KILLPLOTS(PLOTS), KILLPLOTS(ALL) and KILLPLOTS() will apply KILLPLOTS to all the members of PLOTS. note the KILLPLOTS does not KILL etc. and in particular it leaves the information stuck in by SAVEPLOTS. (if you never want to reference a plot again it is probably better to do a KILLPLOTS followed by a KILL, since KILLPLOTS takes care to totally exorcise the arrays in the plot from the system, something that KILL might not manage to do). if you doing a lot of plotting then you may get a message like NO CORE ARRAY when trying the name a plot (either by invoking NAMEPLOT explicitly or by typing rubout after a plot.) if that happens all you have to do is check that all the plots that are important are saved using the SAVEPLOTS command, then do KILLPLOTS(); NAMEPLOT(); LOADPLOTS(); loads a file of plots created by SAVEPLOTS. defaults exactly as with LOADFILE. it also sets the file defaults REPLOT(); replots . if the arrays of were destroyed either by a KILLPLOTS(); or by SAVE'ing and LOADFILE'ing it into another MACSYMA, REPLOT checks to see if was ever saved using the SAVEPLOTS command, if it was it finds the under which it was saved, and then attempts a LOADPLOTS(); (but taking care not to change the current file defaults) and replots if it was found in the file. REPLOT understands the old format of saved plots. OLDNAMEPLOT(); does what SAVEPLOT() used to do, i.e. name the last plot using the old format for naming plots (which could be safely SAVE'd and LOADFILE'd but which took up bags of space) examples: PLOT2(SIN(X),X,-%PI,%PI); SNOO; REPLOT(SNOO); replots snoo PLOTS; [SNOO] KILLPLOTS(); kills the plots in PLOTS i.e. SNOO REPLOT(SNOO); SNOO not a plot (and it wasn't saved) REPLOT(); replots the last plot (which so happens to be the same as SNOO) ARF; SAVEPLOTS([CFK,PLOT,DSK,USERS],ALL); saves the plots in PLOTS KILLPLOTS(); PLOTS; [] there are now no active plots around VALUES; [SNOO,ARF] both SNOO and ARF got put on the values list but only ARF is any good because: SAVE([CFK],VALUES); [[CFK, >, DSK, USERS], SNOO, ARF] ^Z MACSYM^K LOADFILE(CFK,">",DSK,USERS); VALUES; [SNOO,ARF] PLOTS; [] REPLOT(SNOO); SNOO not a plot REPLOT(ARF); CFK PLOT DSK USERS being loaded loading done (ARF is automatically loaded in and replotted) PLOTS; [ARF] KILLPLOTS(); kills the arrays in ARF but saves the fact that it came from CFK PLOT REPLOT(ARF); CFK PLOT DSK USERS being loaded loading done etc. note that things would be more difficult in the above example if i had called both files CFK,">", for then SAVEPLOTS would put the plots in e.g CFK,1 and SAVE would put the VALUES in CFK,2; however ARF would only know that it was saved in CFK,">",DSK,USERS so that the automatic LOADPLOTS that REPLOT tries to do would attempt to load from CFK,">" i.e. CFK,2 caused an error. i would then have to explicitly load up ARF by doing LOADPLOTS(CFK,1,DSK,USERS); 3] REPLOT can take all the optional args that PLOT2 etc took. they will be merged in with the options in effect for the first arg to REPLOT there are also provisions for turning of the options. FALSE is treated is a spacing keyword for determining whether a subsequent option is a title, ylabel etc. it does not turn off any of the labels, that is acheived by the keyword NONE. similarly the use of the transformation functions is turned off by the keyword LIN (for LINear). as before NOT3D turns off the 3d plotting. examples: PLOT2(SIN(X),X,-%PI,%PI,FALSE,FALSE,"THE CAT SAT ON THE MAT"); title is set to "THE CAT .. " REPLOT(TRUE,"X-AXIS"); replots with title and x label REPLOT(TRUE,FALSE,"SIN(X)",NONE); replots with same xlabel a new ylabel and no title REPLOT(TRUE,FALSE,"Y-AXIS"); replots with new ylabel. 4] REPLOT can take a list for its first argument. it then replots the elements of the list. i.e. REPLOT([FOO,BAR], ); is identical to (REPLOT(FOO,), REPLOT(BAR,)); if the first arg to REPLOT is atomic then it is evaluated and the evaluated form is used if is a list 5] if TICKNUM is negative then PLOT2 won't round your x and y axes out to the nearest tick mark. thus with TICKNUM:10; PLOT2(X,X,5,25); has the x and y scales going from 4 to 26, but with TICKNUM:-10; the scales will go from 5 to 25. 6] negative argument ranges are allowed in the plotting functions, e.g. PLOT2(1/X,X,-1,-3); works. the first argument will be calculated in the order indicated (thus 1/(-1.0) will be calculated before 1/(-3.0)) -- this only makes a difference if the computation of the first arg changes variables which change the value returned by subsequent computation. (however the x and y scales will come out in the traditional way, this can be overridden using the SPECIAL option with REFLECT as XFUN or YFUN. see below) 7] if DONT appears as an optional argument to the plotting functions then the points will be calculated, but not plotted. this is primarly of use for creating plots that are to be named and used later. DONT is a non-sticky option (like FIRST and LAST), and so doesn't get saved when the plot is named (so PLOT2(EXP(X),X,-1,1,DONT); REPLOT(); will plot something). 8] if DATEPLOT is TRUE (the default) the date and time of the plot will be stuck in the top right corner of the plot. right now no effort is made to stop this from interferring with the title (this may be changed in the near future). if people dont like this i will consider changing the default to FALSE. 9] the HARDCOPY command knows about the GOULD 5200 in building 38. if you have done PLOTMODE(G,I); PLOTMODE(G,T); or PLOTMODE(G); will queue up your last plot for printing. 10] XGPSAVE has been split into two functions, called NAMEFILE and XGPSAVE1. NAMEFILE() takes the scratch file that PLOT2 uses in PLOTMODE(GOULD); or PLOTMODE(XGP); and copies it to . XGPSAVE1() takes the file and converts it into XGP scan form. XGPSAVE still exists and can be roughly defined as XGPSAVE() := (NAMEFILE(),XGPSAVE1()); the form XGPSAVE(); now uses the traditional default file names. the advantage of this change is that the scratch file (which contains ards graphics commands) is usually much shorter than the corresponding XGP file, thus if you want to generate several plots for the XGP, but aren't able to actually get them out on the XGP for a while then use NAMEPLOT now, and convert them to XGP format with XGPSAVE1 at the last minute. incidently since the file produced by NAMEFILE is ards graphics commands the plot it contains can be viewed by :IMPRNT'ing the file on an imlac 11] arbitrary 2 and 3 dimensional transformations before plotting. if the optional argument SPECIAL appears in the call to PLOT2 then immediately before sticking your data up on the screen PLOT2 looks at the values of XFUN and YFUN (default values are FALSE). if they are FALSE the data gets scaled in the normai way and is plotted without further ado. if either is non-FALSE then it should be the name of a function of 1 to 3 arguments which defines a transformation between the data and the x and y screen coordinates. (the standard linear scaling is still applied the result of this transformation.) the functions must be translated or compiled and must return a floating point result. the way they work is best illustrated by an example. suppose XFUN:POLARX; and YFUN:POLARY; where POLARX and POLARY are defined by TRANSLATE:TRUE; POLARX(X,Y):=(MODEDECLARE([X,Y],FLOAT),Y*COS(X)); POLARY(X,Y):=(MODEDECLARE([X,Y],FLOAT),Y*SIN(X)); (note that X and Y are the THETA and R coorinates of a polar system) then PLOT2(1,X,0,2*%PI,SPECIAL); produces CALCONMPNUM x data points (ranging from 0 to 2*%PI) and CALCOMPNUM corresponding y data points (all 1 in this case). these x and y are given to the POLARX and POLARY functions as the first and second arguments and the value of these two functions is what is supplied to the normal scaling routines. thus this PLOT2 command will produce a circle (if EQUALSCALE:TRUE, an ellipse otherwise). the arguments that XFUN and YFUN take are 1 arg 2 args 3 args XFUN x x,y x,y,z YFUN y x,y x,y,z the first argument to PLOT2 is considered a y variable, and it's second argument an x variable. for PARAMPLOT2 and GRAPH2 the first arguments are x variables and the second arguments are y variables. for all the 2d plotting functions the z variable is 0.0. (see below for the coordinate conventions for the 3d plotting functions). 12] polar, log-log, lin-log and log-lin plots certain XFUN's and YFUN's are predefined and may be specified in the optional args to PLOT2. if POLAR, LOG, LINLOG or LOLIN appear as an optional argument then XFUN and YFUN are bound as follows: optional arg. XFUN YFUN POLAR POLARX POLARY LOG CLOG CLOG LINLOG FALSE CLOG LOGLIN CLOG FALSE where POLARX and POLARY are defined above and CLOG is defined by CLOG(X):=(MODEDECLARE(X,FLOAT), (IF X=0.0 THEN -90.0 ELSE LOG(ABS(X)))/LOG(10.0)); the optional arguments LOG and LOGLIN alse cause PLOT2 to choose logarithmic intervals for the x variable. (something less than optimal probably happens for PARAMPLOT2 in this case). other XFUN's and YFUN's that may be of use are (omitting the MODECLARE's): REFLECT(X):=-X$ YTOX(X,Y):=Y$ XTOY(X,Y):=X$ ZTOY(X,Y,Z):=Z$ ZTOX(X,Y,Z):=Z$ (just the same function really) ROTATEX(X,Y):=X*COSANG-Y*SINANG$ ROTATEY(X,Y):=X*SINANG+Y*COSANG$ (SINANG and COSANG are set up by INITROTATE(ANG):=(COSANG:COS(ANG),SINANG:SIN(ANG));) the various 3d perspective functions are documented below. 13] the first argument to the 3d plotting functions is considered to be a z coordinate. the optional argument NOT3D now causes YFUN to be bound to ZTOY. contour plots dont bind XFUN or YFUN, but you can, so that CONTOURPLOT2(Y,X,0,2*%PI,Y,0,1,POLAR); "works". 14] crosshatching implemented for 3d plots as a default PLOT3D will crosshatch, i.e. plot lines of constant x as well as constant y. you can turn this off by doing CROSSHATCH:FALSE; 15] perspective view for 3d plots more general, defaults better. the line of sight for 3d plots is no longer parallel to one of the axes. the view is now determined by VIEWPT and CENTERPLOT (defaulted to be unbound - like XMAX etc.) VIEWPT may be set to a list of 3 numbers and gives the point from which the projection should be made. CENTERPLOT may likewise to set to a list of 3 numbers and gives a point on the line of sight. the projection will be made onto a plane perpendicular to a line joining VIEWPT and CENTERPLOT. if VIEWPT and CENTERPLOT are unbound (the default) then they will be chosen as follows: the extreme values of the coordinated are determined. this gives the two points min:[xmin,ymin,zmin], max:[xmax,ymax,zmax]. CENTERPLOT is chosen as (min+max)/2, and VIEWPT is chosen as max+3*(max-min). if CENTERPLOT is FALSE then the old type of perspective view will be given (like setting the x and z components of CENTERPLOT to the correspondeing components of VIEWPT). PERSPECTIVE operates as before. REVERSE:TRUE causes a left-handed coordinate system to be assumed. the defaults were chosen so that they will serve for most purposes - note the the default view has z increasing upwards, and x and y increasing towards you to the left and right respectively (right and left if REVERSE:TRUE). the perspective transformations work by the same XFUN and YFUN mechanism documented above. in case to want to try changing the transformation here are the names of the functions used (although it is probably quite easy to confuse the function that figures out the hidden lines) \3DX and \3DY (standard functions) \3DXR and \3DYR (functions when REVERSE:TRUE;) NP3DX, NP3DY, NP3DXR and NP3DYR (non-perspective versions of the above) all the above with OLD concatenated onto the front (e.g. OLD3DX, OLDNP3DXR) give the old perspective views. (all these functions take 3 args). the type of view is setup by doing INITPERSPEC(CX,CY,CZ,VX,VY,VZ); where [VX,VY,VZ] the VIEWPT and [CX,CY,CZ] is the CENTERPLOT 16] scaling for 3d plots has changed. the old scheme of setting ZMAX XMIN etc, to effect changes in the scaling of 3d plots has been flushed. now you may set XMAX, XMIN, YMAX and YMIN, where these quantities refer to the result of the 3d perspective transformations described above. reasonable values for these quantitles may be determined either by applying the transformations to the untransformed values or by examining the value of XMAX1, YMIN1 etc. (see below). 17] GRAPH3D function implemented. right now this is at a fairly rudimentary stage. it takes 3 arguments where GRAPH2 took 2 and interprets them as lists of x, y, and z points which it uses to draw lines using the 3d transformations. it can be used to add lines (e.g. axes) to your 3d plot. the hidden line routines are not used. there are now 4 optional arguments that describe the flavor of 3d plotting, they are \3D (which uses the 3d transformations but not the hidden line routine) HIDE (which is like \3D before, i.e. it uses the hidden line routine) CONTOUR (which produces contour plots) and NOT3D which plots a projection of the x-z plane. so at present the implied optional args for the plotting routines are: function implied optional arg GRAPH3D \3D PLOT3D HIDE CONTOURPLOT2 CONTOUR 18] multiple contour plots are allowed. e.g. CONTOURPLOT2([EXP(-X^2-Y^2),Y^2+SIN(X)],X,-%PI,%PI,Y,-2,2,[0,1]); 19] contours chosen differently. the guy that figures out the contours to plot no longer uses the routine that determines tickmarks. if you want the contours to lie on nice values chose CONTOURS judiciously. the contours are chosen to lie between ZMAX and ZMIN (rather than YMAX and YMIN) since the first arg to CONTOURPLOT2 is considered a z variable. if CONTOURS is the atom INTEGER then the contours will be at lnteger levels. the meaning of CONTOURS being as list or an integer is unchanged. 20] as a default CONTOURPLOT2 will label the contours as best it can this can be turned off by LABELCONTOURS:FALSE. 21] various internal scaling information is now available. this may be of use for drawing axes on 3d plots etc. for most of the options which default to being unbound (e.g. XMAX, WINDOW) the value that PLOT2 assumed can be found by sticking a "1" on the end. e.g. PLOT2(X,X,0,10.1); YMAX; ==> YMAX YMAX1; ==> 11.0 (the max value of y on the y axis) variables in this class are: XMAX1, XMIN1, YMAX1, YMIN1. (these refer to the quantities after the transformation functions have been applied) ZMAX1, ZMIN1 (only of use for contour plots) WINDOW1 (the window in which plotting is done. does not include the room used by titles etc.) XMAX3D, XMIN3D, YMAX3D, YMIN3D, ZMAX3D, ZMIN3D. (these are the values of the 3d data before transforming it to 2d. this will only be up to date information if PLOT3D needed to calculate it to determined either the default VIEWPT or the default CENTERPLOT.) VIEWPT1, CENTERPLOT1 (only of use with 3d plots)  CFK@MIT-MC 06/30/76 11:05:16 To: PLASMA-GROUP at MIT-MC in order to get plots out on the gould printer do: PLOTMODE(G,I); or PLOTMODE(G,T); depending whether you're on the imlac or tektronix. then HARDCOPY(); will queue your last plot for printing. alternatively you can type after your plot. the plots will come out in about 5 mins if the gould is connected.  CFK@MIT-MC (CFK0) 05/15/76 21:31:27 Re: contour plots To: INFO-PLOT2 at MIT-MC the contour tracking part of CONTOURPLOT2 has been made somewhat smarter. contours now always form closed loops or begin and end on the boundary. as an exercise try: CONTOURS:10; CALCOMPNUM:CALCOMPNUM1:10; CONTOURPLOT2(RANDOM(100),X,0,1,Y,0,1); let me know of any problems.  CFK@MIT-MC 05/14/76 00:18:22 Re: more on contour plots To: INFO-PLOT2 at MIT-MC you should choose CALCOMPNUM and CALCOMPNUM1 large enough so that saddle points are not in adjacent mesh cells. the contours dont necessarily form closed curves if this is not the case.  CFK@MIT-MC 05/14/76 00:07:23 To: INFO-PLOT2 at MIT-MC example: CONTOURPLOT2(Z^2/2+COS(X)+X/2,X,-6,6,Z,-3,3); (or: PLOT3D(Z^2/2+COS(X)+X/2,X,-6,6,Z,-3,3,CONTOUR); the two forms are entirely equivalent) CONTOURPLOT2 works by first creating a 2d array of values of its first argument (as with PLOT3D, X takes on CALCOMPNUM values and Z takes on CALCOMPNUM1 values). contours are then drawn using linear interpolation. what contours are drawn is governed by the option CONTOURS (default value 20) which may either be an integer or a list of numbers. if CONTOURS is an integer then approximately CONTOURS equally spaced contours will be drawn between the min and max values of CONTOURPLOT2's first argument (this argument is considered to be a Y variable so you can restrict the range in which contours are drawn by setting YMIN or YMAX). the decision of what contour levels to use is made by the same guy that decides the spacing of tickmarks, so the contours will appear at nice values. if you want to decide on the contour levels CONTOURS should be a list of those levels (in any order), e.g. CONTOURS: [1,0.5,%PI]; Notes: [1] the vertical axis for CONTOURPLOT2 is reckoned to be a Z axis so you change its scaling by changing ZMIN and ZMAX (not YMIN and YMAX, these are used in deciding the contour levels). this is for compatibity with PLOT3D. (however the drawing of the vertical axis is still governed by YAXIS.) [2] internally the data generated by CONTOURPLOT2 is usable by PLOT3D (and vice-versa). once one of them has finished plotting you can do ^A and set \3D to TRUE (to get the old 3d plots) or to CONTOUR (to get a contour plots) or to FALSE (to get a 2d projection of the curves). type EXIT; followed by a tab to replot the plots the new format. alternatively you can do one of the following: REPLOT(TRUE,\3D); REPLOT(TRUE,CONTOUR); or REPLOT(TRUE,NOT3D); [3] changing the values of CONTOURS and doing REPLOT(); will replot your data with the new data. (CONTOURS may also be changed in a ^A break.) [4] all the normal optional arguments can be provided. Defects:[1] you cant superimpose contour plots by supplying a list as the first argument to CONTOURPLOT2. (however you can superimpose them with separate calls to CONTOURPLOT2 by supplying the FIRST, SAME and LAST optional arguments) [2] some slightly higher order interpolation scheme should probably be used to make the contours smoother. [3] the contours are not marked. these defects may be removed in due course.  CFK@MIT-MC 05/07/76 23:18:35 To: INFO-PLOT2 at MIT-MC PLOT2 USAGE has been updated. PLOT2 DEMO has been expanded.  CFK@MIT-MC 05/07/76 22:26:03 To: PLOT2 at MIT-MC document myoptions fo rplotting options  CFK@MIT-MC 05/04/76 12:21:46 To: PLOT2 at MIT-MC TELL IMLAC USERS HOW TO RUN DEMO  CFK@MIT-MC 05/03/76 11:37:35 To: INFO-PLOT2 at MIT-MC symbol 9 is now defined by DEFINESYMBOL(9,TRUE); with TRUE meaning draw a dot. thus to get a point plot do e.g. PLOT2(X,X,0,1,[99]);  CFK@MIT-MC 05/02/76 14:37:25 To: INFO-PLOT2 at MIT-MC plot2 will pheep at you when it's expecting you to type a space, rubout, carriage-return etc. if you find this annoying, you can turn it off by doing PLOTBELL:FALSE$  CFK@MIT-MC 05/02/76 11:53:51 To: PLOT2 at MIT-MC document ticknum:0;  CFK@MIT-MC 04/13/76 18:30:54 Re: markings on axes To: INFO-PLOT2 at MIT-MC XAXIS and YAXIS may be set to FALSE, TRUE or ALL (the default) with the folowing meanings FALSE: dont plot this axis TRUE: plot this axis ALL: plot this axis and put the values of xmax and xmin at the ends. thus if you want to do all your own captioning you should do: NOPRINT:XAXIS:YAXIS:TRUE$  CFK@MIT-MC 04/13/76 18:25:28 To: PLOT2 at MIT-MC cross reference section v and replot4 cross reference same option in section ii  CFK@MIT-MC 04/06/76 22:10:54 Re: PLOT2 documentation To: INFO-PLOT2 at MIT-MC SHARE;PLOT2 USAGE has been updated, as has SHARE;PLOT2 DEMO.  CFK@MIT-MC 04/01/76 17:41:50 Re: generalization of tick marks To: INFO-PLOT2 at MIT-MC both TICKSIZE and TICKNUM may now be lists of two numbers the first referring to the ticks on the xaxis and the second to the ticks on the y axis. thus: TICKSIZE:[6,2000]; TICKNUM:[6,2]; as before if either is just a number it applies to both axes  CFK@MIT-MC 04/01/76 11:00:35 Re: incompatible change to the PLOTMODE function To: INFO-PLOT2 at MIT-MC PLOTMODE now has more easily remembered arguments. possible arguments are: I or IMLAC (plot on imlac) T or TEKTRONIX (plot on tektronix) G or GOULD (set things up for plotting on gould printer not fully implemented yet) X or XGP (set things up for plotting on xgp, using XGPSAVE) any of these arguments may be given accept that I and T may not appear together. the first argument is used to determine the width and height of characters being used. the default settings are PLOTMODE(T); (if PLOT2 thinks you are a tektronix) or PLOTMODE(I); (if it thinks you are an imlac) PLOTMODE(); returns a list of the devices PLOT2 is plotting for correspondence between the old and new PLOTMODE functions is: PLOTMODE(0) ==> PLOTMODE(T) PLOTMODE(1) ==> PLOTMODE(X) PLOTMODE(2) ==> PLOTMODE(X,T) PLOTMODE(3) ==> PLOTMODE(G,T) PLOTMODE(4) ==> PLOTMODE(G) with T being replaced by I if you're on an imlac N.B. when plotting on imlacs PLOT2 now uses ards graphics conventions this should enable most imlacs connected to ITS systems to work.  CFK@MIT-MC 03/25/76 21:35:32 Re: tty hanging after plot2 To: INFO-PLOT2 at MIT-MC i fixed something that probably was the cause of the tty not listening to anything typed at it after PLOT2 is done. if this problem re-occurs please let me know.  CFK@MIT-MC 03/08/76 10:23:25 Re: emptying the output buffer To: INFO-PLOT2 at MIT-MC the chars to create a plot get put in a buffer, and normally only get sent when the buffer is full or when the plot is complete. the user can force the buffer contents to be sent by typing ^\ (control-shift-L on the tektronix, control-\ on the imlac). (this is probably only of use to to users of WORLDPLOT, which because of its ridiculously inefficient implementation will sometimes wait until it has gone thru the whole world before sending anything out.)  CFK@MIT-MC 02/29/76 18:30:11 Re: how the type-list works To: INFO-PLOT2 at MIT-MC the elements of the type-list in the optional args to plot2 are now evaluated. this allows the folowing construction: for i from 0 thru 10 do (plot2(sin(x)+i,x,0,10,[i])); (previously you would have had to do: for i from 0 thru 10 do (typel:[i],plot2(sin(x)+i,x,0,10,typel)); here typel gets evaluated because it is atomic)  CFK@MIT-MC 02/29/76 10:33:24 Re: geography To: INFO-PLOT2 at MIT-MC to plot your favorite portion of the world do WORLDPLOT(,,,); the arguments are in degrees. the projection is unorthodox. e.g. WORLDPLOT(-10,10,48,60);  CFK@MIT-MC 02/21/76 19:58:43 Re: REPLOT4 for plotting 4 plots on the screen To: INFO-PLOT2 at MIT-MC the function REPLOT4 is available for quickly replotting 4 plots in different parts of the screen. it can take up to 4 arguments which must be saved plots. it plots the first plot in the upper left hand corner of the default window (or of your own window, if WINDOW has a value), the second arg in the upper right hand corner etc. it stops when it runs out of things to plot. this function takes care of the business of specifying the FIRST and LAST options to REPLOT, so dont give them to REPLOT4. example: PLOT2(X,X,0,1); SAVEPLOT(A1); PLOT2(SIN(X),X,0,2*%PI); SAVEPLOT(B[1]); PLOT2(X^2,X,0,1); SAVEPLOT(FOO); REPLOT4(A1,B[1],FOO);  CFK@MIT-MC 02/21/76 16:02:37 Re: plotting things on the SAME scale To: INFO-PLOT2 at MIT-MC if SAME appears amongst the last args to PLOT2, GRAPH2, PARAMPLOT2 or REPLOT, it means plot this plot to the same scale as the previous plot. plotting of axes and the printing of the line giving XMAX etc is supressed. specification of a title and labels is allowed, but if the previous plot which defines the scale of this plot didnt have them they may appear in the wrong place (having wrapped around the screen). if you want to specify a title, then you should probably specify a null title "" in the original plot. all this allows the superposition of plots in a convenient way. e.g. CALCOMPNUM:40$ PARAMPLOT2(SIN(T),COS(T),T,0,2*%PI,FALSE,FALSE,""); EQUALSCALE:TRUE$ SAVEPLOT(TEMPLATE)$ FOR CALCOMPNUM FROM 4 THRU 10 DO (REPLOT(TEMPLATE,FIRST), TITLE:CONCAT("N = ",CALCOMPNUM-1), PARAMPLOT2(SIN(T),COS(T),T,0,2*%PI,FALSE,FALSE,TITLE,SAME,LAST) );  CFK@MIT-MC 02/21/76 13:41:42 Re: plotting at 9600 baud To: PLOT2 at MIT-MC when plotting on the tektronix PLOT2 uses a more long winded form of vector drawing commands in order for things to work ok at 9600 baud. whether the long winded form for vectors is used is governed by the switch PADDED (defaults to TRUE for the tek- tronix and FALSE for the imlac). so if you are using the tek- tronix at low speed you may want to set PADDED to FALSE, to speed things up  CFK@MIT-MC 02/21/76 13:38:34 Re: hardcopies, clearing the screen To: PLOT2 at MIT-MC there are two new characters you can type when a plot is finished. they are: this clears the screen this gives you a hardcopy there are two new functions available. they are CLEAR(); clears the screen HARDCOPY(); makes a hardcopy (if you're on the tektronix)