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