1*48519Sbostic /*- 2*48519Sbostic * Copyright (c) 1985 The Regents of the University of California. 3*48519Sbostic * All rights reserved. 4*48519Sbostic * 5*48519Sbostic * %sccs.include.proprietary.c% 624989Ssam */ 724989Ssam 824989Ssam #ifndef lint 9*48519Sbostic static char sccsid[] = "@(#)arc.c 5.2 (Berkeley) 04/22/91"; 10*48519Sbostic #endif /* not lint */ 1124989Ssam 1224989Ssam int del = 20; 1324989Ssam step(d){ 1424989Ssam del = d; 1524989Ssam } 1624989Ssam arc(x,y,x0,y0,x1,y1){ 1724989Ssam double pc; 1824989Ssam double sqrt(); 1924989Ssam int flg,m,xc,yc,xs,ys,qs,qf; 2024989Ssam float dx,dy,r; 2124989Ssam char use; 2224989Ssam dx = x-x0; 2324989Ssam dy = y-y0; 2424989Ssam r = dx*dx+dy*dy; 2524989Ssam pc = r; 2624989Ssam pc = sqrt(pc); 2724989Ssam flg = pc/4; 2824989Ssam if(flg == 0)step(1); 2924989Ssam else if(flg < del)step(flg); 3024989Ssam xc = xs = x0; 3124989Ssam yc = ys = y0; 3224989Ssam move(xs,ys); 3324989Ssam if(x0 == x1 && y0 == y1)flg=0; 3424989Ssam else flg=1; 3524989Ssam qs = quad(x,y,x0,y0); 3624989Ssam qf = quad(x,y,x1,y1); 3724989Ssam if(abs(x-x1) < abs(y-y1)){ 3824989Ssam use = 'x'; 3924989Ssam if(qs == 2 || qs ==3)m = -1; 4024989Ssam else m=1; 4124989Ssam } 4224989Ssam else { 4324989Ssam use = 'y'; 4424989Ssam if(qs > 2)m= -1; 4524989Ssam else m= 1; 4624989Ssam } 4724989Ssam while(1){ 4824989Ssam switch(use){ 4924989Ssam case 'x': 5024989Ssam if(qs == 2 || qs == 3)yc -= del; 5124989Ssam else yc += del; 5224989Ssam dy = yc-y; 5324989Ssam pc = r-dy*dy; 5424989Ssam xc = m*sqrt(pc)+x; 5524989Ssam if((x < xs && x >= xc) || ( x > xs && x <= xc) || 5624989Ssam (y < ys && y >= yc) || ( y > ys && y <= yc) ) 5724989Ssam { 5824989Ssam if(++qs > 4)qs=1; 5924989Ssam if(qs == 2 || qs == 3)m= -1; 6024989Ssam else m=1; 6124989Ssam flg=1; 6224989Ssam } 6324989Ssam cont(xc,yc); 6424989Ssam xs = xc; 6524989Ssam ys = yc; 6624989Ssam if(qs == qf && flg == 1) 6724989Ssam switch(qf){ 6824989Ssam case 3: 6924989Ssam case 4: 7024989Ssam if(xs >= x1)return; 7124989Ssam continue; 7224989Ssam case 1: 7324989Ssam case 2: 7424989Ssam if(xs <= x1)return; 7524989Ssam } 7624989Ssam continue; 7724989Ssam case 'y': 7824989Ssam if(qs > 2)xc += del; 7924989Ssam else xc -= del; 8024989Ssam dx = xc-x; 8124989Ssam pc = r-dx*dx; 8224989Ssam yc = m*sqrt(pc)+y; 8324989Ssam if((x < xs && x >= xc) || ( x > xs && x <= xc ) || 8424989Ssam (y < ys && y >= yc) || (y > ys && y <= yc) ) 8524989Ssam { 8624989Ssam if(++qs > 4)qs=1; 8724989Ssam if(qs > 2)m = -1; 8824989Ssam else m = 1; 8924989Ssam flg=1; 9024989Ssam } 9124989Ssam cont(xc,yc); 9224989Ssam xs = xc; 9324989Ssam ys = yc; 9424989Ssam if(qs == qf && flg == 1) 9524989Ssam switch(qs){ 9624989Ssam case 1: 9724989Ssam case 4: 9824989Ssam if(ys >= y1)return; 9924989Ssam continue; 10024989Ssam case 2: 10124989Ssam case 3: 10224989Ssam if(ys <= y1)return; 10324989Ssam } 10424989Ssam } 10524989Ssam } 10624989Ssam } 10724989Ssam quad(x,y,xp,yp){ 10824989Ssam if(x < xp) 10924989Ssam if(y <= yp)return(1); 11024989Ssam else return(4); 11124989Ssam else if(x > xp) 11224989Ssam if(y < yp)return(2); 11324989Ssam else return(3); 11424989Ssam else if(y < yp)return(2); 11524989Ssam else return(4); 11624989Ssam } 11724989Ssam abs(a){ 11824989Ssam if(a < 0)return(-a); 11924989Ssam return(a); 12024989Ssam } 121