xref: /csrg-svn/lib/libplot/t4013/arc.c (revision 22612)
1*22612Sdist /*
2*22612Sdist  * Copyright (c) 1980 Regents of the University of California.
3*22612Sdist  * All rights reserved.  The Berkeley software License Agreement
4*22612Sdist  * specifies the terms and conditions for redistribution.
5*22612Sdist  */
6*22612Sdist 
717609Sjak #ifndef lint
8*22612Sdist static char sccsid[] = "@(#)arc.c	5.1 (Berkeley) 06/07/85";
9*22612Sdist #endif not lint
1017609Sjak 
1117609Sjak int del = 20;
1217609Sjak step(d){
1317609Sjak 	del = d;
1417609Sjak }
1517609Sjak arc(x,y,x0,y0,x1,y1){
1617609Sjak 	double pc;
1717609Sjak 	double sqrt();
1817609Sjak 	int flg,m,xc,yc,xs,ys,qs,qf;
1917609Sjak 	float dx,dy,r;
2017609Sjak 	char use;
2117609Sjak 	dx = x-x0;
2217609Sjak 	dy = y-y0;
2317609Sjak 	r = dx*dx+dy*dy;
2417609Sjak 	pc = r;
2517609Sjak 	pc = sqrt(pc);
2617609Sjak 	flg = pc/4;
2717609Sjak 	if(flg == 0)step(1);
2817609Sjak 	else if(flg < del)step(flg);
2917609Sjak 	xc = xs = x0;
3017609Sjak 	yc = ys = y0;
3117609Sjak 	move(xs,ys);
3217609Sjak 	if(x0 == x1 && y0 == y1)flg=0;
3317609Sjak 	else flg=1;
3417609Sjak 	qs = quad(x,y,x0,y0);
3517609Sjak 	qf = quad(x,y,x1,y1);
3617609Sjak 	if(abs(x-x1) < abs(y-y1)){
3717609Sjak 		use = 'x';
3817609Sjak 		if(qs == 2 || qs ==3)m = -1;
3917609Sjak 		else m=1;
4017609Sjak 	}
4117609Sjak 	else {
4217609Sjak 		use = 'y';
4317609Sjak 		if(qs > 2)m= -1;
4417609Sjak 		else m= 1;
4517609Sjak 	}
4617609Sjak 	while(1){
4717609Sjak 		switch(use){
4817609Sjak 		case 'x':
4917609Sjak 			if(qs == 2 || qs == 3)yc -= del;
5017609Sjak 			else yc += del;
5117609Sjak 			dy = yc-y;
5217609Sjak 			pc = r-dy*dy;
5317609Sjak 			xc = m*sqrt(pc)+x;
5417609Sjak 			if((x < xs && x >= xc) || ( x > xs && x <= xc) ||
5517609Sjak 			    (y < ys && y >= yc) || ( y > ys && y <=  yc) )
5617609Sjak 			{
5717609Sjak 				if(++qs > 4)qs=1;
5817609Sjak 				if(qs == 2 || qs == 3)m= -1;
5917609Sjak 				else m=1;
6017609Sjak 				flg=1;
6117609Sjak 			}
6217609Sjak 			cont(xc,yc);
6317609Sjak 			xs = xc;
6417609Sjak 			ys = yc;
6517609Sjak 			if(qs == qf && flg == 1)
6617609Sjak 				switch(qf){
6717609Sjak 				case 3:
6817609Sjak 				case 4:
6917609Sjak 					if(xs >= x1)return;
7017609Sjak 					continue;
7117609Sjak 				case 1:
7217609Sjak 				case 2:
7317609Sjak 					if(xs <= x1)return;
7417609Sjak 				}
7517609Sjak 			continue;
7617609Sjak 		case 'y':
7717609Sjak 			if(qs > 2)xc += del;
7817609Sjak 			else xc -= del;
7917609Sjak 			dx = xc-x;
8017609Sjak 			pc = r-dx*dx;
8117609Sjak 			yc = m*sqrt(pc)+y;
8217609Sjak 			if((x < xs && x >= xc) || ( x > xs && x <= xc ) ||
8317609Sjak 			    (y < ys && y >= yc) || (y > ys && y <= yc) )
8417609Sjak 			{
8517609Sjak 				if(++qs > 4)qs=1;
8617609Sjak 				if(qs > 2)m = -1;
8717609Sjak 				else m = 1;
8817609Sjak 				flg=1;
8917609Sjak 			}
9017609Sjak 			cont(xc,yc);
9117609Sjak 			xs = xc;
9217609Sjak 			ys = yc;
9317609Sjak 			if(qs == qf && flg == 1)
9417609Sjak 				switch(qs){
9517609Sjak 				case 1:
9617609Sjak 				case 4:
9717609Sjak 					if(ys >= y1)return;
9817609Sjak 					continue;
9917609Sjak 				case 2:
10017609Sjak 				case 3:
10117609Sjak 					if(ys <= y1)return;
10217609Sjak 				}
10317609Sjak 		}
10417609Sjak 	}
10517609Sjak }
10617609Sjak quad(x,y,xp,yp){
10717609Sjak 	if(x < xp)
10817609Sjak 		if(y <= yp)return(1);
10917609Sjak 		else return(4);
11017609Sjak 	else if(x > xp)
11117609Sjak 		if(y < yp)return(2);
11217609Sjak 		else return(3);
11317609Sjak 	else if(y < yp)return(2);
11417609Sjak 	else return(4);
11517609Sjak }
116