1*48524Sbostic /*- 2*48524Sbostic * Copyright (c) 1983 The Regents of the University of California. 3*48524Sbostic * All rights reserved. 4*48524Sbostic * 5*48524Sbostic * %sccs.include.proprietary.c% 6*48524Sbostic */ 7*48524Sbostic 813342Ssam #ifndef lint 9*48524Sbostic static char sccsid[] = "@(#)arc.c 4.4 (Berkeley) 04/22/91"; 10*48524Sbostic #endif /* not lint */ 1113342Ssam 1213342Ssam int del = 20; 1313342Ssam step(d){ 1413342Ssam del = d; 1513342Ssam } 1613342Ssam arc(x,y,x0,y0,x1,y1){ 1713342Ssam double pc; 1813342Ssam double sqrt(); 1913342Ssam int flg,m,xc,yc,xs,ys,qs,qf; 2013342Ssam float dx,dy,r; 2113342Ssam char use; 2213342Ssam dx = x-x0; 2313342Ssam dy = y-y0; 2413342Ssam r = dx*dx+dy*dy; 2513342Ssam pc = r; 2623685Smckusick pc = pc > 0 ? sqrt(pc) : 0; 2713342Ssam flg = pc/4; 2813342Ssam if(flg == 0)step(1); 2913342Ssam else if(flg < del)step(flg); 3013342Ssam xc = xs = x0; 3113342Ssam yc = ys = y0; 3213342Ssam move(xs,ys); 3313342Ssam if(x0 == x1 && y0 == y1)flg=0; 3413342Ssam else flg=1; 3513342Ssam qs = quad(x,y,x0,y0); 3613342Ssam qf = quad(x,y,x1,y1); 3713342Ssam if(abs(x-x1) < abs(y-y1)){ 3813342Ssam use = 'x'; 3913342Ssam if(qs == 2 || qs ==3)m = -1; 4013342Ssam else m=1; 4113342Ssam } 4213342Ssam else { 4313342Ssam use = 'y'; 4413342Ssam if(qs > 2)m= -1; 4513342Ssam else m= 1; 4613342Ssam } 4713342Ssam while(1){ 4813342Ssam switch(use){ 4913342Ssam case 'x': 5013342Ssam if(qs == 2 || qs == 3)yc -= del; 5113342Ssam else yc += del; 5213342Ssam dy = yc-y; 5313342Ssam pc = r-dy*dy; 5423685Smckusick xc = m*(pc > 0 ? sqrt(pc) : 0)+x; 5513342Ssam if((x < xs && x >= xc) || ( x > xs && x <= xc) || 5613342Ssam (y < ys && y >= yc) || ( y > ys && y <= yc) ) 5713342Ssam { 5813342Ssam if(++qs > 4)qs=1; 5913342Ssam if(qs == 2 || qs == 3)m= -1; 6013342Ssam else m=1; 6113342Ssam flg=1; 6213342Ssam } 6313342Ssam cont(xc,yc); 6413342Ssam xs = xc; 6513342Ssam ys = yc; 6613342Ssam if(qs == qf && flg == 1) 6713342Ssam switch(qf){ 6813342Ssam case 3: 6913342Ssam case 4: 7013342Ssam if(xs >= x1)return; 7113342Ssam continue; 7213342Ssam case 1: 7313342Ssam case 2: 7413342Ssam if(xs <= x1)return; 7513342Ssam } 7613342Ssam continue; 7713342Ssam case 'y': 7813342Ssam if(qs > 2)xc += del; 7913342Ssam else xc -= del; 8013342Ssam dx = xc-x; 8113342Ssam pc = r-dx*dx; 8223685Smckusick yc = m*(pc > 0 ? sqrt(pc) : 0)+y; 8313342Ssam if((x < xs && x >= xc) || ( x > xs && x <= xc ) || 8413342Ssam (y < ys && y >= yc) || (y > ys && y <= yc) ) 8513342Ssam { 8613342Ssam if(++qs > 4)qs=1; 8713342Ssam if(qs > 2)m = -1; 8813342Ssam else m = 1; 8913342Ssam flg=1; 9013342Ssam } 9113342Ssam cont(xc,yc); 9213342Ssam xs = xc; 9313342Ssam ys = yc; 9413342Ssam if(qs == qf && flg == 1) 9513342Ssam switch(qs){ 9613342Ssam case 1: 9713342Ssam case 4: 9813342Ssam if(ys >= y1)return; 9913342Ssam continue; 10013342Ssam case 2: 10113342Ssam case 3: 10213342Ssam if(ys <= y1)return; 10313342Ssam } 10413342Ssam } 10513342Ssam } 10613342Ssam } 10713342Ssam quad(x,y,xp,yp){ 10813342Ssam if(x < xp) 10913342Ssam if(y <= yp)return(1); 11013342Ssam else return(4); 11113342Ssam else if(x > xp) 11213342Ssam if(y < yp)return(2); 11313342Ssam else return(3); 11413342Ssam else if(y < yp)return(2); 11513342Ssam else return(4); 11613342Ssam } 117