roy@phri.UUCP (Roy Smith) (09/05/88)
I often have to do vector operations in PostScript. Since I always get horribly confused trying to work out the stack manipulations each time, I came up with a set of vector operations. These work on 2-vectors (which is what I need most often), but it should be trivial to extend them to 3-vectors, etc. Coding general n-vectors might be a trip, however. It's not much, but enjoy it anyway. Also, if anybody can point out a faster way to do any of these operations, let me know. /roy ---------------- % % Vectorops.ps -- vector operators for PostScript. % % Copyright 1987 Roy Smith % Permission is hereby granted for any use of this software other % than selling it or including it in a commercial product. % % $Header: vectorops.ps,v 1.1 87/09/16 20:31:59 roy Exp $ % % vadd -- add two vectors. % x1 y1 x2 y2 vadd ==> x1+x2 y1+y2 /vadd { 3 -1 roll add % ==> x1 x2 y2+y1 3 1 roll add % ==> y2+y1 x1+x2 exch % ==> x1+x2 y2+y1 } def % vsub -- subtract two vectors. % x1 y1 x2 y2 vsub ==> x1-x2 y1-y2 /vsub { 3 -1 roll sub neg % ==> x1 x2 -(y2-y1) 3 1 roll sub % ==> -(y2-y1) x1-x2 exch % ==> x1-x2 -(y2-y1) } def % vneg -- take negative of vector (scalar multiply by -1). % x y vneg ==> -x -y /vneg { exch neg % ==> y -x exch neg % ==> -x -y } def % vdiv -- divide vector by scalar. % x y s vdiv ==> x/s y/s /vdiv { dup % ==> x y s s 3 1 roll div % ==> x s y/s 3 1 roll div % ==> y/s x/s exch % ==> x/s y/s } def % vmul -- multiply vector by scalar. % x y s vmul ==> x*s y*s /vmul { dup % ==> x y s s 3 1 roll mul % ==> x s y*s 3 1 roll mul % ==> y*s x*s exch % ==> x*s y*s } def % vexch -- exchange two vectors on stack. % x1 y1 x2 y2 vexch => x2 y2 x1 y1 /vexch { 4 2 roll % ==> x2 y2 x1 y1 } def % vpop -- pop a vector off the stack. % x1 y1 vpop => --- /vpop { pop pop } def % vdup -- duplicate a vector on the stack. % x1 y1 vdup => x1 y1 x1 y1 /vdup { dup % ==> x1 y1 y1 3 -1 roll dup % ==> y1 y1 x1 x1 4 1 roll exch % ==> x1 y1 x1 y1 } def -- Roy Smith, System Administrator Public Health Research Institute {allegra,philabs,cmcl2,rutgers}!phri!roy -or- phri!roy@uunet.uu.net "The connector is the network"