date and time created 83/06/27 14:19:12 by sam
authorSam Leffler <sam@ucbvax.Berkeley.EDU>
Tue, 28 Jun 1983 05:19:12 +0000 (21:19 -0800)
committerSam Leffler <sam@ucbvax.Berkeley.EDU>
Tue, 28 Jun 1983 05:19:12 +0000 (21:19 -0800)
SCCS-vsn: lib/libplot/t4014/arc.c 4.1

usr/src/lib/libplot/t4014/arc.c [new file with mode: 0644]

diff --git a/usr/src/lib/libplot/t4014/arc.c b/usr/src/lib/libplot/t4014/arc.c
new file mode 100644 (file)
index 0000000..ecdfb5e
--- /dev/null
@@ -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);
+}