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