xref: /csrg-svn/lib/libplot/t4014/arc.c (revision 61406)
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