xref: /csrg-svn/lib/libplot/t4014/arc.c (revision 13342)
1*13342Ssam #ifndef lint
2*13342Ssam static char sccsid[] = "@(#)arc.c	4.1 (Berkeley) 06/27/83";
3*13342Ssam #endif
4*13342Ssam 
5*13342Ssam int del = 20;
6*13342Ssam step(d){
7*13342Ssam 	del = d;
8*13342Ssam }
9*13342Ssam arc(x,y,x0,y0,x1,y1){
10*13342Ssam 	double pc;
11*13342Ssam 	double sqrt();
12*13342Ssam 	int flg,m,xc,yc,xs,ys,qs,qf;
13*13342Ssam 	float dx,dy,r;
14*13342Ssam 	char use;
15*13342Ssam 	dx = x-x0;
16*13342Ssam 	dy = y-y0;
17*13342Ssam 	r = dx*dx+dy*dy;
18*13342Ssam 	pc = r;
19*13342Ssam 	pc = sqrt(pc);
20*13342Ssam 	flg = pc/4;
21*13342Ssam 	if(flg == 0)step(1);
22*13342Ssam 	else if(flg < del)step(flg);
23*13342Ssam 	xc = xs = x0;
24*13342Ssam 	yc = ys = y0;
25*13342Ssam 	move(xs,ys);
26*13342Ssam 	if(x0 == x1 && y0 == y1)flg=0;
27*13342Ssam 	else flg=1;
28*13342Ssam 	qs = quad(x,y,x0,y0);
29*13342Ssam 	qf = quad(x,y,x1,y1);
30*13342Ssam 	if(abs(x-x1) < abs(y-y1)){
31*13342Ssam 		use = 'x';
32*13342Ssam 		if(qs == 2 || qs ==3)m = -1;
33*13342Ssam 		else m=1;
34*13342Ssam 	}
35*13342Ssam 	else {
36*13342Ssam 		use = 'y';
37*13342Ssam 		if(qs > 2)m= -1;
38*13342Ssam 		else m= 1;
39*13342Ssam 	}
40*13342Ssam 	while(1){
41*13342Ssam 		switch(use){
42*13342Ssam 		case 'x':
43*13342Ssam 			if(qs == 2 || qs == 3)yc -= del;
44*13342Ssam 			else yc += del;
45*13342Ssam 			dy = yc-y;
46*13342Ssam 			pc = r-dy*dy;
47*13342Ssam 			xc = m*sqrt(pc)+x;
48*13342Ssam 			if((x < xs && x >= xc) || ( x > xs && x <= xc) ||
49*13342Ssam 			    (y < ys && y >= yc) || ( y > ys && y <=  yc) )
50*13342Ssam 			{
51*13342Ssam 				if(++qs > 4)qs=1;
52*13342Ssam 				if(qs == 2 || qs == 3)m= -1;
53*13342Ssam 				else m=1;
54*13342Ssam 				flg=1;
55*13342Ssam 			}
56*13342Ssam 			cont(xc,yc);
57*13342Ssam 			xs = xc;
58*13342Ssam 			ys = yc;
59*13342Ssam 			if(qs == qf && flg == 1)
60*13342Ssam 				switch(qf){
61*13342Ssam 				case 3:
62*13342Ssam 				case 4:
63*13342Ssam 					if(xs >= x1)return;
64*13342Ssam 					continue;
65*13342Ssam 				case 1:
66*13342Ssam 				case 2:
67*13342Ssam 					if(xs <= x1)return;
68*13342Ssam 				}
69*13342Ssam 			continue;
70*13342Ssam 		case 'y':
71*13342Ssam 			if(qs > 2)xc += del;
72*13342Ssam 			else xc -= del;
73*13342Ssam 			dx = xc-x;
74*13342Ssam 			pc = r-dx*dx;
75*13342Ssam 			yc = m*sqrt(pc)+y;
76*13342Ssam 			if((x < xs && x >= xc) || ( x > xs && x <= xc ) ||
77*13342Ssam 			    (y < ys && y >= yc) || (y > ys && y <= yc) )
78*13342Ssam 			{
79*13342Ssam 				if(++qs > 4)qs=1;
80*13342Ssam 				if(qs > 2)m = -1;
81*13342Ssam 				else m = 1;
82*13342Ssam 				flg=1;
83*13342Ssam 			}
84*13342Ssam 			cont(xc,yc);
85*13342Ssam 			xs = xc;
86*13342Ssam 			ys = yc;
87*13342Ssam 			if(qs == qf && flg == 1)
88*13342Ssam 				switch(qs){
89*13342Ssam 				case 1:
90*13342Ssam 				case 4:
91*13342Ssam 					if(ys >= y1)return;
92*13342Ssam 					continue;
93*13342Ssam 				case 2:
94*13342Ssam 				case 3:
95*13342Ssam 					if(ys <= y1)return;
96*13342Ssam 				}
97*13342Ssam 		}
98*13342Ssam 	}
99*13342Ssam }
100*13342Ssam quad(x,y,xp,yp){
101*13342Ssam 	if(x < xp)
102*13342Ssam 		if(y <= yp)return(1);
103*13342Ssam 		else return(4);
104*13342Ssam 	else if(x > xp)
105*13342Ssam 		if(y < yp)return(2);
106*13342Ssam 		else return(3);
107*13342Ssam 	else if(y < yp)return(2);
108*13342Ssam 	else return(4);
109*13342Ssam }
110*13342Ssam abs(a){
111*13342Ssam 	if(a < 0)return(-a);
112*13342Ssam 	return(a);
113*13342Ssam }
114