1 #ifndef lint 2 static char sccsid[] = "@(#)subr.c 4.1 (Berkeley) 06/27/83"; 3 #endif 4 5 #include <stdio.h> 6 #include "con.h" 7 abval(q) 8 { 9 return (q>=0 ? q : -q); 10 } 11 12 xconv (xp) 13 { 14 /* x position input is -2047 to +2047, output must be 0 to PAGSIZ*HORZRES */ 15 xp += 2048; 16 /* the computation is newx = xp*(PAGSIZ*HORZRES)/4096 */ 17 return (xoffset + xp /xscale); 18 } 19 20 yconv (yp) 21 { 22 /* see description of xconv */ 23 yp += 2048; 24 return (yp / yscale); 25 } 26 27 inplot() 28 { 29 stty(OUTF, &PTTY); 30 spew(ESC); 31 spew (INPLOT); 32 } 33 34 outplot() 35 { 36 spew(ESC); 37 spew(ACK); 38 spew(ESC); 39 spew(ACK); 40 fflush(stdout); 41 stty (OUTF, &ITTY); 42 } 43 44 spew(ch) 45 { 46 putc(ch, stdout); 47 } 48 49 tobotleft () 50 { 51 move(-2048,-2048); 52 } 53 reset() 54 { 55 outplot(); 56 exit(); 57 } 58 59 float 60 dist2 (x1, y1, x2, y2) 61 { 62 float t,v; 63 t = x2-x1; 64 v = y1-y2; 65 return (t*t+v*v); 66 } 67 68 swap (pa, pb) 69 int *pa, *pb; 70 { 71 int t; 72 t = *pa; 73 *pa = *pb; 74 *pb = t; 75 } 76 77 #define DOUBLE 010 78 #define ADDR 0100 79 #define COM 060 80 #define MAXX 070 81 #define MAXY 07 82 extern xnow,ynow; 83 #define SPACES 7 84 movep(ix,iy){ 85 int dx,dy,remx,remy,pts,i; 86 int xd,yd; 87 int addr,command; 88 char c; 89 if(xnow == ix && ynow == iy)return; 90 inplot(); 91 dx = ix-xnow; 92 dy = iy-ynow; 93 command = COM|PENUP|((dx<0)<<1)|(dy<0); 94 dx = abval(dx); 95 dy = abval(dy); 96 xd = dx/(SPACES*2); 97 yd = dy/(SPACES*2); 98 pts = xd<yd?xd:yd; 99 if((i=pts)>0){ 100 c=command|DOUBLE; 101 addr=ADDR; 102 if(xd>0)addr|=MAXX; 103 if(yd>0)addr|=MAXY; 104 spew(c); 105 while(i--){ 106 spew(addr); 107 } 108 } 109 if(xd!=yd){ 110 if(xd>pts){ 111 i=xd-pts; 112 addr=ADDR|MAXX; 113 } 114 else{ 115 i=yd-pts; 116 addr=ADDR|MAXY; 117 } 118 c=command|DOUBLE; 119 spew(c); 120 while(i--){ 121 spew(addr); 122 } 123 } 124 remx=dx-xd*SPACES*2; 125 remy=dy-yd*SPACES*2; 126 addr=ADDR; 127 i = 0; 128 if(remx>7){ 129 i=1; 130 addr|=MAXX; 131 remx -= 7; 132 } 133 if(remy>7){ 134 i=1; 135 addr|=MAXY; 136 remy -= 7; 137 } 138 while(i--){ 139 spew(command); 140 spew(addr); 141 } 142 if(remx>0||remy>0){ 143 spew(command); 144 spew(ADDR|remx<<3|remy); 145 } 146 xnow=ix; 147 ynow=iy; 148 outplot(); 149 return; 150 } 151 xsc(xi){ 152 int xa; 153 xa = (xi - obotx) * scalex + botx; 154 return(xa); 155 } 156 ysc(yi){ 157 int ya; 158 ya = (yi - oboty) *scaley +boty; 159 return(ya); 160 } 161