1 #ifndef lint 2 static char sccsid[] = "@(#)arc.c 4.3 (Berkeley) 06/23/85"; 3 #endif 4 5 int del = 20; 6 step(d){ 7 del = d; 8 } 9 arc(x,y,x0,y0,x1,y1){ 10 double pc; 11 double sqrt(); 12 int flg,m,xc,yc,xs,ys,qs,qf; 13 float dx,dy,r; 14 char use; 15 dx = x-x0; 16 dy = y-y0; 17 r = dx*dx+dy*dy; 18 pc = r; 19 pc = pc > 0 ? sqrt(pc) : 0; 20 flg = pc/4; 21 if(flg == 0)step(1); 22 else if(flg < del)step(flg); 23 xc = xs = x0; 24 yc = ys = y0; 25 move(xs,ys); 26 if(x0 == x1 && y0 == y1)flg=0; 27 else flg=1; 28 qs = quad(x,y,x0,y0); 29 qf = quad(x,y,x1,y1); 30 if(abs(x-x1) < abs(y-y1)){ 31 use = 'x'; 32 if(qs == 2 || qs ==3)m = -1; 33 else m=1; 34 } 35 else { 36 use = 'y'; 37 if(qs > 2)m= -1; 38 else m= 1; 39 } 40 while(1){ 41 switch(use){ 42 case 'x': 43 if(qs == 2 || qs == 3)yc -= del; 44 else yc += del; 45 dy = yc-y; 46 pc = r-dy*dy; 47 xc = m*(pc > 0 ? sqrt(pc) : 0)+x; 48 if((x < xs && x >= xc) || ( x > xs && x <= xc) || 49 (y < ys && y >= yc) || ( y > ys && y <= yc) ) 50 { 51 if(++qs > 4)qs=1; 52 if(qs == 2 || qs == 3)m= -1; 53 else m=1; 54 flg=1; 55 } 56 cont(xc,yc); 57 xs = xc; 58 ys = yc; 59 if(qs == qf && flg == 1) 60 switch(qf){ 61 case 3: 62 case 4: 63 if(xs >= x1)return; 64 continue; 65 case 1: 66 case 2: 67 if(xs <= x1)return; 68 } 69 continue; 70 case 'y': 71 if(qs > 2)xc += del; 72 else xc -= del; 73 dx = xc-x; 74 pc = r-dx*dx; 75 yc = m*(pc > 0 ? sqrt(pc) : 0)+y; 76 if((x < xs && x >= xc) || ( x > xs && x <= xc ) || 77 (y < ys && y >= yc) || (y > ys && y <= yc) ) 78 { 79 if(++qs > 4)qs=1; 80 if(qs > 2)m = -1; 81 else m = 1; 82 flg=1; 83 } 84 cont(xc,yc); 85 xs = xc; 86 ys = yc; 87 if(qs == qf && flg == 1) 88 switch(qs){ 89 case 1: 90 case 4: 91 if(ys >= y1)return; 92 continue; 93 case 2: 94 case 3: 95 if(ys <= y1)return; 96 } 97 } 98 } 99 } 100 quad(x,y,xp,yp){ 101 if(x < xp) 102 if(y <= yp)return(1); 103 else return(4); 104 else if(x > xp) 105 if(y < yp)return(2); 106 else return(3); 107 else if(y < yp)return(2); 108 else return(4); 109 } 110