148523Sbostic /*-
2*61403Sbostic * Copyright (c) 1985, 1993
3*61403Sbostic * The Regents of the University of California. All rights reserved.
448523Sbostic *
548523Sbostic * %sccs.include.proprietary.c%
622612Sdist */
722612Sdist
817609Sjak #ifndef lint
9*61403Sbostic static char sccsid[] = "@(#)arc.c 8.1 (Berkeley) 06/04/93";
1048523Sbostic #endif /* not lint */
1117609Sjak
1217609Sjak int del = 20;
step(d)1317609Sjak step(d){
1417609Sjak del = d;
1517609Sjak }
arc(x,y,x0,y0,x1,y1)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 }
quad(x,y,xp,yp)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