From: Sam Leffler Date: Tue, 28 Jun 1983 05:19:12 +0000 (-0800) Subject: date and time created 83/06/27 14:19:12 by sam X-Git-Tag: BSD-4_2-Snapshot-Development~1282 X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/commitdiff_plain/37b00441e96c23fa8c30ff9ec8b8699ccf6719c9 date and time created 83/06/27 14:19:12 by sam SCCS-vsn: lib/libplot/t4014/arc.c 4.1 --- diff --git a/usr/src/lib/libplot/t4014/arc.c b/usr/src/lib/libplot/t4014/arc.c new file mode 100644 index 0000000000..ecdfb5e9b2 --- /dev/null +++ b/usr/src/lib/libplot/t4014/arc.c @@ -0,0 +1,113 @@ +#ifndef lint +static char sccsid[] = "@(#)arc.c 4.1 (Berkeley) %G%"; +#endif + +int del = 20; +step(d){ + del = d; +} +arc(x,y,x0,y0,x1,y1){ + double pc; + double sqrt(); + int flg,m,xc,yc,xs,ys,qs,qf; + float dx,dy,r; + char use; + dx = x-x0; + dy = y-y0; + r = dx*dx+dy*dy; + pc = r; + pc = sqrt(pc); + flg = pc/4; + if(flg == 0)step(1); + else if(flg < del)step(flg); + xc = xs = x0; + yc = ys = y0; + move(xs,ys); + if(x0 == x1 && y0 == y1)flg=0; + else flg=1; + qs = quad(x,y,x0,y0); + qf = quad(x,y,x1,y1); + if(abs(x-x1) < abs(y-y1)){ + use = 'x'; + if(qs == 2 || qs ==3)m = -1; + else m=1; + } + else { + use = 'y'; + if(qs > 2)m= -1; + else m= 1; + } + while(1){ + switch(use){ + case 'x': + if(qs == 2 || qs == 3)yc -= del; + else yc += del; + dy = yc-y; + pc = r-dy*dy; + xc = m*sqrt(pc)+x; + if((x < xs && x >= xc) || ( x > xs && x <= xc) || + (y < ys && y >= yc) || ( y > ys && y <= yc) ) + { + if(++qs > 4)qs=1; + if(qs == 2 || qs == 3)m= -1; + else m=1; + flg=1; + } + cont(xc,yc); + xs = xc; + ys = yc; + if(qs == qf && flg == 1) + switch(qf){ + case 3: + case 4: + if(xs >= x1)return; + continue; + case 1: + case 2: + if(xs <= x1)return; + } + continue; + case 'y': + if(qs > 2)xc += del; + else xc -= del; + dx = xc-x; + pc = r-dx*dx; + yc = m*sqrt(pc)+y; + if((x < xs && x >= xc) || ( x > xs && x <= xc ) || + (y < ys && y >= yc) || (y > ys && y <= yc) ) + { + if(++qs > 4)qs=1; + if(qs > 2)m = -1; + else m = 1; + flg=1; + } + cont(xc,yc); + xs = xc; + ys = yc; + if(qs == qf && flg == 1) + switch(qs){ + case 1: + case 4: + if(ys >= y1)return; + continue; + case 2: + case 3: + if(ys <= y1)return; + } + } + } +} +quad(x,y,xp,yp){ + if(x < xp) + if(y <= yp)return(1); + else return(4); + else if(x > xp) + if(y < yp)return(2); + else return(3); + else if(y < yp)return(2); + else return(4); +} +abs(a){ + if(a < 0)return(-a); + return(a); +}