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