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