1*48523Sbostic /*- 2*48523Sbostic * Copyright (c) 1985 The Regents of the University of California. 3*48523Sbostic * All rights reserved. 4*48523Sbostic * 5*48523Sbostic * %sccs.include.proprietary.c% 622612Sdist */ 722612Sdist 817609Sjak #ifndef lint 9*48523Sbostic static char sccsid[] = "@(#)arc.c 5.3 (Berkeley) 04/22/91"; 10*48523Sbostic #endif /* not lint */ 1117609Sjak 1217609Sjak int del = 20; 1317609Sjak step(d){ 1417609Sjak del = d; 1517609Sjak } 1617609Sjak arc(x,y,x0,y0,x1,y1){ 1717609Sjak double pc; 1817609Sjak double sqrt(); 1917609Sjak int flg,m,xc,yc,xs,ys,qs,qf; 2017609Sjak float dx,dy,r; 2117609Sjak char use; 2217609Sjak dx = x-x0; 2317609Sjak dy = y-y0; 2417609Sjak r = dx*dx+dy*dy; 2517609Sjak pc = r; 2623683Smckusick pc = pc > 0 ? sqrt(pc) : 0; 2717609Sjak flg = pc/4; 2817609Sjak if(flg == 0)step(1); 2917609Sjak else if(flg < del)step(flg); 3017609Sjak xc = xs = x0; 3117609Sjak yc = ys = y0; 3217609Sjak move(xs,ys); 3317609Sjak if(x0 == x1 && y0 == y1)flg=0; 3417609Sjak else flg=1; 3517609Sjak qs = quad(x,y,x0,y0); 3617609Sjak qf = quad(x,y,x1,y1); 3717609Sjak if(abs(x-x1) < abs(y-y1)){ 3817609Sjak use = 'x'; 3917609Sjak if(qs == 2 || qs ==3)m = -1; 4017609Sjak else m=1; 4117609Sjak } 4217609Sjak else { 4317609Sjak use = 'y'; 4417609Sjak if(qs > 2)m= -1; 4517609Sjak else m= 1; 4617609Sjak } 4717609Sjak while(1){ 4817609Sjak switch(use){ 4917609Sjak case 'x': 5017609Sjak if(qs == 2 || qs == 3)yc -= del; 5117609Sjak else yc += del; 5217609Sjak dy = yc-y; 5317609Sjak pc = r-dy*dy; 5423683Smckusick xc = m*(pc > 0 ? sqrt(pc) : 0)+x; 5517609Sjak if((x < xs && x >= xc) || ( x > xs && x <= xc) || 5617609Sjak (y < ys && y >= yc) || ( y > ys && y <= yc) ) 5717609Sjak { 5817609Sjak if(++qs > 4)qs=1; 5917609Sjak if(qs == 2 || qs == 3)m= -1; 6017609Sjak else m=1; 6117609Sjak flg=1; 6217609Sjak } 6317609Sjak cont(xc,yc); 6417609Sjak xs = xc; 6517609Sjak ys = yc; 6617609Sjak if(qs == qf && flg == 1) 6717609Sjak switch(qf){ 6817609Sjak case 3: 6917609Sjak case 4: 7017609Sjak if(xs >= x1)return; 7117609Sjak continue; 7217609Sjak case 1: 7317609Sjak case 2: 7417609Sjak if(xs <= x1)return; 7517609Sjak } 7617609Sjak continue; 7717609Sjak case 'y': 7817609Sjak if(qs > 2)xc += del; 7917609Sjak else xc -= del; 8017609Sjak dx = xc-x; 8117609Sjak pc = r-dx*dx; 8223683Smckusick yc = m*(pc > 0 ? sqrt(pc) : 0)+y; 8317609Sjak if((x < xs && x >= xc) || ( x > xs && x <= xc ) || 8417609Sjak (y < ys && y >= yc) || (y > ys && y <= yc) ) 8517609Sjak { 8617609Sjak if(++qs > 4)qs=1; 8717609Sjak if(qs > 2)m = -1; 8817609Sjak else m = 1; 8917609Sjak flg=1; 9017609Sjak } 9117609Sjak cont(xc,yc); 9217609Sjak xs = xc; 9317609Sjak ys = yc; 9417609Sjak if(qs == qf && flg == 1) 9517609Sjak switch(qs){ 9617609Sjak case 1: 9717609Sjak case 4: 9817609Sjak if(ys >= y1)return; 9917609Sjak continue; 10017609Sjak case 2: 10117609Sjak case 3: 10217609Sjak if(ys <= y1)return; 10317609Sjak } 10417609Sjak } 10517609Sjak } 10617609Sjak } 10717609Sjak quad(x,y,xp,yp){ 10817609Sjak if(x < xp) 10917609Sjak if(y <= yp)return(1); 11017609Sjak else return(4); 11117609Sjak else if(x > xp) 11217609Sjak if(y < yp)return(2); 11317609Sjak else return(3); 11417609Sjak else if(y < yp)return(2); 11517609Sjak else return(4); 11617609Sjak } 117