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