adams@hpfelg.HP.COM (John Adams) (12/30/89)
Currently the 28s only supports scatter plots or drawing
equations. This program reads the scatter data in the 'sDAT'
(SigmaDAT) variable and performs a connect the dots output. The
user can scale and translate the grahical output exactly like any
normal graphical operation.
The program "Graphit" is used to parse the independent and
dependent variables and calculates the x,y step sizes in order to
optimize the output performance. Since the PPAR values are used,
all PMIN, PMAX, RES *W, *H, etc. values are taken into
consideration.
The routine doing all the work is Connect. This routine takes
6 items from the stack; two coordinates, x, and y step increment.
The routine then draws a line from the second coord to the first
at a resolution given by the RES value. The routine "Connect"
routine is low level enough to build upon (bar graph?).
NOTE: Could someone post this to the list server.
John Adams
-----------------------------------------------------------------------
Graphit [A005]
requires a variable 'sDAT'
takes/returns nothing from/to stack.
{ VARS 'PPAR' POS ; check is PPAR exists,
IF 0 == ; if not then scale matrix
THEN SCLs ; NOTE the 's' is a Sigma
END 'PPAR(2)' EVAL ; get PMAX, PMIN, and RES from PPAR
C->R SWAP 'PPAR(1)' ; and compute x and y step sizes
EVAL C->R ROT ROT - ; from (xmin-xmin)*res/137
ROT ROT - 32 / SWAP ; and (ymax-ymin)/32
'PPAR(4)' EVAL * 137 ;
/ sPAR LIST-> 3 DROPN ;
sDAT SIZE LIST-> ; find number of elements to plot
DROP2 2 CLLCD -> ; set current coord pointer to 2nd
ystep step xcol ycol ; coordinate.
max cnt ;
{ 'sDAT(1,xcol)' ; push first coord onto stack
EVAL 'sDAT(1,ycol)' ;
EVAL ;
DO 'sDAT(cnt, ; push current coord onto stack
xcol)' EVAL 'sDAT( ;
cnt,ycol)' EVAL 4 ; rearrange stack (xnew,ynew,xold,yold)
ROLLD 4 ROLLD step ; push x and y steps onto stack
ystep Connect 1 cnt ; and call Connect routine, increment
+ 'cnt' STO ; current pointer and make 'new' coord
UNTIL cnt max > ; repeat for all points in matrix
END DROP2 ; leave stack as before.
} DGTIZ ; enable interactive mode.
} ;
Connect [A0F7]
requires from stack:
xto
yto
xfrom
yfrom
xinc
yinc
returns to the stack:
xto
yto
<< -> x2 y2 x1 y1 step ; Grab vectors from stack.
ystep ;
<< x2 y2 x1 y1 ' ;
SIGN(x2-x1)*step' ; Calculate step w/direction
EVAL 'step' STO ' ; store as step.
SIGN(y2-y1)*ystep' ; Do the same for the y direction
EVAL 'ystep' STO ;
IF step 0 == ; If line is vertical, set xstep
THEN 0 ystep ; to 0 and ystep to ystep.
ELSE step '(y2- ; Otherwise set xstep to step and
y1)/(x2-x1)*step' ; ystep to the slope of the line.
EVAL ;
END x1 y1 -> x2 ; Initialize the current coord.
y2 x1 y1 xstep ystep ;
xx yy ;
<< ;
IF xstep 0 # ; NOTE: # is the not equals symbol
THEN x1 x2 ; For a non-vertical line, increment
FOR xx ystep ; along the x axis and add the slope
yy + 'yy' STO xx yy ; to the y coord.
R->C PIXEL xstep ; Plot the coordinate and increment
STEP ; the x coord by xstep.
ELSE y1 y2 ; ELSE if a vertical line we don't
FOR yy xx yy ; need to bother with incrementing
R->C PIXEL ystep ; the x coord.
STEP ;
END x2 y2 ; Return the 'to' coordinate to the
>> ; stack.
>> ;