148519Sbostic /*-
2*61395Sbostic * Copyright (c) 1985, 1993
3*61395Sbostic * The Regents of the University of California. All rights reserved.
448519Sbostic *
548519Sbostic * %sccs.include.proprietary.c%
624989Ssam */
724989Ssam
824989Ssam #ifndef lint
9*61395Sbostic static char sccsid[] = "@(#)arc.c 8.1 (Berkeley) 06/04/93";
1048519Sbostic #endif /* not lint */
1124989Ssam
1224989Ssam int del = 20;
step(d)1324989Ssam step(d){
1424989Ssam del = d;
1524989Ssam }
arc(x,y,x0,y0,x1,y1)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 }
quad(x,y,xp,yp)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 }
abs(a)11724989Ssam abs(a){
11824989Ssam if(a < 0)return(-a);
11924989Ssam return(a);
12024989Ssam }
121