xref: /csrg-svn/lib/libplot/t4014/arc.c (revision 23685)
113342Ssam #ifndef lint
2*23685Smckusick static char sccsid[] = "@(#)arc.c	4.3 (Berkeley) 06/23/85";
313342Ssam #endif
413342Ssam 
513342Ssam int del = 20;
613342Ssam step(d){
713342Ssam 	del = d;
813342Ssam }
913342Ssam arc(x,y,x0,y0,x1,y1){
1013342Ssam 	double pc;
1113342Ssam 	double sqrt();
1213342Ssam 	int flg,m,xc,yc,xs,ys,qs,qf;
1313342Ssam 	float dx,dy,r;
1413342Ssam 	char use;
1513342Ssam 	dx = x-x0;
1613342Ssam 	dy = y-y0;
1713342Ssam 	r = dx*dx+dy*dy;
1813342Ssam 	pc = r;
19*23685Smckusick 	pc = pc > 0 ? sqrt(pc) : 0;
2013342Ssam 	flg = pc/4;
2113342Ssam 	if(flg == 0)step(1);
2213342Ssam 	else if(flg < del)step(flg);
2313342Ssam 	xc = xs = x0;
2413342Ssam 	yc = ys = y0;
2513342Ssam 	move(xs,ys);
2613342Ssam 	if(x0 == x1 && y0 == y1)flg=0;
2713342Ssam 	else flg=1;
2813342Ssam 	qs = quad(x,y,x0,y0);
2913342Ssam 	qf = quad(x,y,x1,y1);
3013342Ssam 	if(abs(x-x1) < abs(y-y1)){
3113342Ssam 		use = 'x';
3213342Ssam 		if(qs == 2 || qs ==3)m = -1;
3313342Ssam 		else m=1;
3413342Ssam 	}
3513342Ssam 	else {
3613342Ssam 		use = 'y';
3713342Ssam 		if(qs > 2)m= -1;
3813342Ssam 		else m= 1;
3913342Ssam 	}
4013342Ssam 	while(1){
4113342Ssam 		switch(use){
4213342Ssam 		case 'x':
4313342Ssam 			if(qs == 2 || qs == 3)yc -= del;
4413342Ssam 			else yc += del;
4513342Ssam 			dy = yc-y;
4613342Ssam 			pc = r-dy*dy;
47*23685Smckusick 			xc = m*(pc > 0 ? sqrt(pc) : 0)+x;
4813342Ssam 			if((x < xs && x >= xc) || ( x > xs && x <= xc) ||
4913342Ssam 			    (y < ys && y >= yc) || ( y > ys && y <=  yc) )
5013342Ssam 			{
5113342Ssam 				if(++qs > 4)qs=1;
5213342Ssam 				if(qs == 2 || qs == 3)m= -1;
5313342Ssam 				else m=1;
5413342Ssam 				flg=1;
5513342Ssam 			}
5613342Ssam 			cont(xc,yc);
5713342Ssam 			xs = xc;
5813342Ssam 			ys = yc;
5913342Ssam 			if(qs == qf && flg == 1)
6013342Ssam 				switch(qf){
6113342Ssam 				case 3:
6213342Ssam 				case 4:
6313342Ssam 					if(xs >= x1)return;
6413342Ssam 					continue;
6513342Ssam 				case 1:
6613342Ssam 				case 2:
6713342Ssam 					if(xs <= x1)return;
6813342Ssam 				}
6913342Ssam 			continue;
7013342Ssam 		case 'y':
7113342Ssam 			if(qs > 2)xc += del;
7213342Ssam 			else xc -= del;
7313342Ssam 			dx = xc-x;
7413342Ssam 			pc = r-dx*dx;
75*23685Smckusick 			yc = m*(pc > 0 ? sqrt(pc) : 0)+y;
7613342Ssam 			if((x < xs && x >= xc) || ( x > xs && x <= xc ) ||
7713342Ssam 			    (y < ys && y >= yc) || (y > ys && y <= yc) )
7813342Ssam 			{
7913342Ssam 				if(++qs > 4)qs=1;
8013342Ssam 				if(qs > 2)m = -1;
8113342Ssam 				else m = 1;
8213342Ssam 				flg=1;
8313342Ssam 			}
8413342Ssam 			cont(xc,yc);
8513342Ssam 			xs = xc;
8613342Ssam 			ys = yc;
8713342Ssam 			if(qs == qf && flg == 1)
8813342Ssam 				switch(qs){
8913342Ssam 				case 1:
9013342Ssam 				case 4:
9113342Ssam 					if(ys >= y1)return;
9213342Ssam 					continue;
9313342Ssam 				case 2:
9413342Ssam 				case 3:
9513342Ssam 					if(ys <= y1)return;
9613342Ssam 				}
9713342Ssam 		}
9813342Ssam 	}
9913342Ssam }
10013342Ssam quad(x,y,xp,yp){
10113342Ssam 	if(x < xp)
10213342Ssam 		if(y <= yp)return(1);
10313342Ssam 		else return(4);
10413342Ssam 	else if(x > xp)
10513342Ssam 		if(y < yp)return(2);
10613342Ssam 		else return(3);
10713342Ssam 	else if(y < yp)return(2);
10813342Ssam 	else return(4);
10913342Ssam }
110