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