113342Ssam #ifndef lint 2*23685Smckusick static char sccsid[] = "@(#)arc.c 4.3 (Berkeley) 06/23/85"; 313342Ssam #endif 413342Ssam 513342Ssam int del = 20; 613342Ssam step(d){ 713342Ssam del = d; 813342Ssam } 913342Ssam arc(x,y,x0,y0,x1,y1){ 1013342Ssam double pc; 1113342Ssam double sqrt(); 1213342Ssam int flg,m,xc,yc,xs,ys,qs,qf; 1313342Ssam float dx,dy,r; 1413342Ssam char use; 1513342Ssam dx = x-x0; 1613342Ssam dy = y-y0; 1713342Ssam r = dx*dx+dy*dy; 1813342Ssam pc = r; 19*23685Smckusick pc = pc > 0 ? sqrt(pc) : 0; 2013342Ssam flg = pc/4; 2113342Ssam if(flg == 0)step(1); 2213342Ssam else if(flg < del)step(flg); 2313342Ssam xc = xs = x0; 2413342Ssam yc = ys = y0; 2513342Ssam move(xs,ys); 2613342Ssam if(x0 == x1 && y0 == y1)flg=0; 2713342Ssam else flg=1; 2813342Ssam qs = quad(x,y,x0,y0); 2913342Ssam qf = quad(x,y,x1,y1); 3013342Ssam if(abs(x-x1) < abs(y-y1)){ 3113342Ssam use = 'x'; 3213342Ssam if(qs == 2 || qs ==3)m = -1; 3313342Ssam else m=1; 3413342Ssam } 3513342Ssam else { 3613342Ssam use = 'y'; 3713342Ssam if(qs > 2)m= -1; 3813342Ssam else m= 1; 3913342Ssam } 4013342Ssam while(1){ 4113342Ssam switch(use){ 4213342Ssam case 'x': 4313342Ssam if(qs == 2 || qs == 3)yc -= del; 4413342Ssam else yc += del; 4513342Ssam dy = yc-y; 4613342Ssam pc = r-dy*dy; 47*23685Smckusick xc = m*(pc > 0 ? sqrt(pc) : 0)+x; 4813342Ssam if((x < xs && x >= xc) || ( x > xs && x <= xc) || 4913342Ssam (y < ys && y >= yc) || ( y > ys && y <= yc) ) 5013342Ssam { 5113342Ssam if(++qs > 4)qs=1; 5213342Ssam if(qs == 2 || qs == 3)m= -1; 5313342Ssam else m=1; 5413342Ssam flg=1; 5513342Ssam } 5613342Ssam cont(xc,yc); 5713342Ssam xs = xc; 5813342Ssam ys = yc; 5913342Ssam if(qs == qf && flg == 1) 6013342Ssam switch(qf){ 6113342Ssam case 3: 6213342Ssam case 4: 6313342Ssam if(xs >= x1)return; 6413342Ssam continue; 6513342Ssam case 1: 6613342Ssam case 2: 6713342Ssam if(xs <= x1)return; 6813342Ssam } 6913342Ssam continue; 7013342Ssam case 'y': 7113342Ssam if(qs > 2)xc += del; 7213342Ssam else xc -= del; 7313342Ssam dx = xc-x; 7413342Ssam pc = r-dx*dx; 75*23685Smckusick yc = m*(pc > 0 ? sqrt(pc) : 0)+y; 7613342Ssam if((x < xs && x >= xc) || ( x > xs && x <= xc ) || 7713342Ssam (y < ys && y >= yc) || (y > ys && y <= yc) ) 7813342Ssam { 7913342Ssam if(++qs > 4)qs=1; 8013342Ssam if(qs > 2)m = -1; 8113342Ssam else m = 1; 8213342Ssam flg=1; 8313342Ssam } 8413342Ssam cont(xc,yc); 8513342Ssam xs = xc; 8613342Ssam ys = yc; 8713342Ssam if(qs == qf && flg == 1) 8813342Ssam switch(qs){ 8913342Ssam case 1: 9013342Ssam case 4: 9113342Ssam if(ys >= y1)return; 9213342Ssam continue; 9313342Ssam case 2: 9413342Ssam case 3: 9513342Ssam if(ys <= y1)return; 9613342Ssam } 9713342Ssam } 9813342Ssam } 9913342Ssam } 10013342Ssam quad(x,y,xp,yp){ 10113342Ssam if(x < xp) 10213342Ssam if(y <= yp)return(1); 10313342Ssam else return(4); 10413342Ssam else if(x > xp) 10513342Ssam if(y < yp)return(2); 10613342Ssam else return(3); 10713342Ssam else if(y < yp)return(2); 10813342Ssam else return(4); 10913342Ssam } 110