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