xref: /csrg-svn/lib/libplot/imagen/arc.c (revision 61395)
148519Sbostic /*-
2*61395Sbostic  * Copyright (c) 1985, 1993
3*61395Sbostic  *	The Regents of the University of California.  All rights reserved.
448519Sbostic  *
548519Sbostic  * %sccs.include.proprietary.c%
624989Ssam  */
724989Ssam 
824989Ssam #ifndef lint
9*61395Sbostic static char sccsid[] = "@(#)arc.c	8.1 (Berkeley) 06/04/93";
1048519Sbostic #endif /* not lint */
1124989Ssam 
1224989Ssam int del = 20;
step(d)1324989Ssam step(d){
1424989Ssam 	del = d;
1524989Ssam }
arc(x,y,x0,y0,x1,y1)1624989Ssam arc(x,y,x0,y0,x1,y1){
1724989Ssam 	double pc;
1824989Ssam 	double sqrt();
1924989Ssam 	int flg,m,xc,yc,xs,ys,qs,qf;
2024989Ssam 	float dx,dy,r;
2124989Ssam 	char use;
2224989Ssam 	dx = x-x0;
2324989Ssam 	dy = y-y0;
2424989Ssam 	r = dx*dx+dy*dy;
2524989Ssam 	pc = r;
2624989Ssam 	pc = sqrt(pc);
2724989Ssam 	flg = pc/4;
2824989Ssam 	if(flg == 0)step(1);
2924989Ssam 	else if(flg < del)step(flg);
3024989Ssam 	xc = xs = x0;
3124989Ssam 	yc = ys = y0;
3224989Ssam 	move(xs,ys);
3324989Ssam 	if(x0 == x1 && y0 == y1)flg=0;
3424989Ssam 	else flg=1;
3524989Ssam 	qs = quad(x,y,x0,y0);
3624989Ssam 	qf = quad(x,y,x1,y1);
3724989Ssam 	if(abs(x-x1) < abs(y-y1)){
3824989Ssam 		use = 'x';
3924989Ssam 		if(qs == 2 || qs ==3)m = -1;
4024989Ssam 		else m=1;
4124989Ssam 	}
4224989Ssam 	else {
4324989Ssam 		use = 'y';
4424989Ssam 		if(qs > 2)m= -1;
4524989Ssam 		else m= 1;
4624989Ssam 	}
4724989Ssam 	while(1){
4824989Ssam 		switch(use){
4924989Ssam 		case 'x':
5024989Ssam 			if(qs == 2 || qs == 3)yc -= del;
5124989Ssam 			else yc += del;
5224989Ssam 			dy = yc-y;
5324989Ssam 			pc = r-dy*dy;
5424989Ssam 			xc = m*sqrt(pc)+x;
5524989Ssam 			if((x < xs && x >= xc) || ( x > xs && x <= xc) ||
5624989Ssam 			    (y < ys && y >= yc) || ( y > ys && y <=  yc) )
5724989Ssam 			{
5824989Ssam 				if(++qs > 4)qs=1;
5924989Ssam 				if(qs == 2 || qs == 3)m= -1;
6024989Ssam 				else m=1;
6124989Ssam 				flg=1;
6224989Ssam 			}
6324989Ssam 			cont(xc,yc);
6424989Ssam 			xs = xc;
6524989Ssam 			ys = yc;
6624989Ssam 			if(qs == qf && flg == 1)
6724989Ssam 				switch(qf){
6824989Ssam 				case 3:
6924989Ssam 				case 4:
7024989Ssam 					if(xs >= x1)return;
7124989Ssam 					continue;
7224989Ssam 				case 1:
7324989Ssam 				case 2:
7424989Ssam 					if(xs <= x1)return;
7524989Ssam 				}
7624989Ssam 			continue;
7724989Ssam 		case 'y':
7824989Ssam 			if(qs > 2)xc += del;
7924989Ssam 			else xc -= del;
8024989Ssam 			dx = xc-x;
8124989Ssam 			pc = r-dx*dx;
8224989Ssam 			yc = m*sqrt(pc)+y;
8324989Ssam 			if((x < xs && x >= xc) || ( x > xs && x <= xc ) ||
8424989Ssam 			    (y < ys && y >= yc) || (y > ys && y <= yc) )
8524989Ssam 			{
8624989Ssam 				if(++qs > 4)qs=1;
8724989Ssam 				if(qs > 2)m = -1;
8824989Ssam 				else m = 1;
8924989Ssam 				flg=1;
9024989Ssam 			}
9124989Ssam 			cont(xc,yc);
9224989Ssam 			xs = xc;
9324989Ssam 			ys = yc;
9424989Ssam 			if(qs == qf && flg == 1)
9524989Ssam 				switch(qs){
9624989Ssam 				case 1:
9724989Ssam 				case 4:
9824989Ssam 					if(ys >= y1)return;
9924989Ssam 					continue;
10024989Ssam 				case 2:
10124989Ssam 				case 3:
10224989Ssam 					if(ys <= y1)return;
10324989Ssam 				}
10424989Ssam 		}
10524989Ssam 	}
10624989Ssam }
quad(x,y,xp,yp)10724989Ssam quad(x,y,xp,yp){
10824989Ssam 	if(x < xp)
10924989Ssam 		if(y <= yp)return(1);
11024989Ssam 		else return(4);
11124989Ssam 	else if(x > xp)
11224989Ssam 		if(y < yp)return(2);
11324989Ssam 		else return(3);
11424989Ssam 	else if(y < yp)return(2);
11524989Ssam 	else return(4);
11624989Ssam }
abs(a)11724989Ssam abs(a){
11824989Ssam 	if(a < 0)return(-a);
11924989Ssam 	return(a);
12024989Ssam }
121