148524Sbostic /*-
2*61406Sbostic * Copyright (c) 1983, 1993
3*61406Sbostic * The Regents of the University of California. All rights reserved.
448524Sbostic *
548524Sbostic * %sccs.include.proprietary.c%
648524Sbostic */
748524Sbostic
813342Ssam #ifndef lint
9*61406Sbostic static char sccsid[] = "@(#)arc.c 8.1 (Berkeley) 06/04/93";
1048524Sbostic #endif /* not lint */
1113342Ssam
1213342Ssam int del = 20;
step(d)1313342Ssam step(d){
1413342Ssam del = d;
1513342Ssam }
arc(x,y,x0,y0,x1,y1)1613342Ssam arc(x,y,x0,y0,x1,y1){
1713342Ssam double pc;
1813342Ssam double sqrt();
1913342Ssam int flg,m,xc,yc,xs,ys,qs,qf;
2013342Ssam float dx,dy,r;
2113342Ssam char use;
2213342Ssam dx = x-x0;
2313342Ssam dy = y-y0;
2413342Ssam r = dx*dx+dy*dy;
2513342Ssam pc = r;
2623685Smckusick pc = pc > 0 ? sqrt(pc) : 0;
2713342Ssam flg = pc/4;
2813342Ssam if(flg == 0)step(1);
2913342Ssam else if(flg < del)step(flg);
3013342Ssam xc = xs = x0;
3113342Ssam yc = ys = y0;
3213342Ssam move(xs,ys);
3313342Ssam if(x0 == x1 && y0 == y1)flg=0;
3413342Ssam else flg=1;
3513342Ssam qs = quad(x,y,x0,y0);
3613342Ssam qf = quad(x,y,x1,y1);
3713342Ssam if(abs(x-x1) < abs(y-y1)){
3813342Ssam use = 'x';
3913342Ssam if(qs == 2 || qs ==3)m = -1;
4013342Ssam else m=1;
4113342Ssam }
4213342Ssam else {
4313342Ssam use = 'y';
4413342Ssam if(qs > 2)m= -1;
4513342Ssam else m= 1;
4613342Ssam }
4713342Ssam while(1){
4813342Ssam switch(use){
4913342Ssam case 'x':
5013342Ssam if(qs == 2 || qs == 3)yc -= del;
5113342Ssam else yc += del;
5213342Ssam dy = yc-y;
5313342Ssam pc = r-dy*dy;
5423685Smckusick xc = m*(pc > 0 ? sqrt(pc) : 0)+x;
5513342Ssam if((x < xs && x >= xc) || ( x > xs && x <= xc) ||
5613342Ssam (y < ys && y >= yc) || ( y > ys && y <= yc) )
5713342Ssam {
5813342Ssam if(++qs > 4)qs=1;
5913342Ssam if(qs == 2 || qs == 3)m= -1;
6013342Ssam else m=1;
6113342Ssam flg=1;
6213342Ssam }
6313342Ssam cont(xc,yc);
6413342Ssam xs = xc;
6513342Ssam ys = yc;
6613342Ssam if(qs == qf && flg == 1)
6713342Ssam switch(qf){
6813342Ssam case 3:
6913342Ssam case 4:
7013342Ssam if(xs >= x1)return;
7113342Ssam continue;
7213342Ssam case 1:
7313342Ssam case 2:
7413342Ssam if(xs <= x1)return;
7513342Ssam }
7613342Ssam continue;
7713342Ssam case 'y':
7813342Ssam if(qs > 2)xc += del;
7913342Ssam else xc -= del;
8013342Ssam dx = xc-x;
8113342Ssam pc = r-dx*dx;
8223685Smckusick yc = m*(pc > 0 ? sqrt(pc) : 0)+y;
8313342Ssam if((x < xs && x >= xc) || ( x > xs && x <= xc ) ||
8413342Ssam (y < ys && y >= yc) || (y > ys && y <= yc) )
8513342Ssam {
8613342Ssam if(++qs > 4)qs=1;
8713342Ssam if(qs > 2)m = -1;
8813342Ssam else m = 1;
8913342Ssam flg=1;
9013342Ssam }
9113342Ssam cont(xc,yc);
9213342Ssam xs = xc;
9313342Ssam ys = yc;
9413342Ssam if(qs == qf && flg == 1)
9513342Ssam switch(qs){
9613342Ssam case 1:
9713342Ssam case 4:
9813342Ssam if(ys >= y1)return;
9913342Ssam continue;
10013342Ssam case 2:
10113342Ssam case 3:
10213342Ssam if(ys <= y1)return;
10313342Ssam }
10413342Ssam }
10513342Ssam }
10613342Ssam }
quad(x,y,xp,yp)10713342Ssam quad(x,y,xp,yp){
10813342Ssam if(x < xp)
10913342Ssam if(y <= yp)return(1);
11013342Ssam else return(4);
11113342Ssam else if(x > xp)
11213342Ssam if(y < yp)return(2);
11313342Ssam else return(3);
11413342Ssam else if(y < yp)return(2);
11513342Ssam else return(4);
11613342Ssam }
117