xref: /plan9/sys/src/cmd/plot/libplot/rarc.c (revision 3e12c5d1bb89fc02707907988834ef147769ddaf)
1*3e12c5d1SDavid du Colombier #include "mplot.h"
2*3e12c5d1SDavid du Colombier /*		arc plotting routine		*/
3*3e12c5d1SDavid du Colombier /*		from x1,y1 to x2,y2		*/
4*3e12c5d1SDavid du Colombier /*	with center xc,yc and radius rr	*/
5*3e12c5d1SDavid du Colombier /*	integrates difference equation		*/
6*3e12c5d1SDavid du Colombier /*	negative rr draws counterclockwise	*/
7*3e12c5d1SDavid du Colombier #define PI4 0.7854
8*3e12c5d1SDavid du Colombier void rarc(double x1, double y1, double x2, double y2, double xc, double yc, double rr){
9*3e12c5d1SDavid du Colombier 	register double dx, dy, a, b;
10*3e12c5d1SDavid du Colombier 	double	ph, dph, rd, xnext;
11*3e12c5d1SDavid du Colombier 	register int	n;
12*3e12c5d1SDavid du Colombier 	dx = x1 - xc;
13*3e12c5d1SDavid du Colombier 	dy = y1 - yc;
14*3e12c5d1SDavid du Colombier 	rd = sqrt(dx * dx + dy * dy);
15*3e12c5d1SDavid du Colombier 	if (rd / e1->quantum < 1.0) {
16*3e12c5d1SDavid du Colombier 		move(xc, yc);
17*3e12c5d1SDavid du Colombier 		vec(xc, yc);
18*3e12c5d1SDavid du Colombier 		return;
19*3e12c5d1SDavid du Colombier 	}
20*3e12c5d1SDavid du Colombier 	dph = acos(1.0 - (e1->quantum / rd));
21*3e12c5d1SDavid du Colombier 	if (dph > PI4)
22*3e12c5d1SDavid du Colombier 		dph = PI4;
23*3e12c5d1SDavid du Colombier 	ph=atan2((y2-yc),(x2 - xc)) - atan2(dy, dx);
24*3e12c5d1SDavid du Colombier 	if (ph < 0)
25*3e12c5d1SDavid du Colombier 		ph += 6.2832;
26*3e12c5d1SDavid du Colombier 	if (rr < 0)
27*3e12c5d1SDavid du Colombier 		ph = 6.2832 - ph;
28*3e12c5d1SDavid du Colombier 	if (ph < dph)
29*3e12c5d1SDavid du Colombier 		line(x1, y1, x2, y2);
30*3e12c5d1SDavid du Colombier 	else {
31*3e12c5d1SDavid du Colombier 		n = ph / dph;
32*3e12c5d1SDavid du Colombier 		a = cos(dph);
33*3e12c5d1SDavid du Colombier 		b = sin(dph);
34*3e12c5d1SDavid du Colombier 		if (rr < 0)
35*3e12c5d1SDavid du Colombier 			b = -b;
36*3e12c5d1SDavid du Colombier 		move(x1, y1);
37*3e12c5d1SDavid du Colombier 		while ((n--) >= 0) {
38*3e12c5d1SDavid du Colombier 			xnext = dx * a - dy * b;
39*3e12c5d1SDavid du Colombier 			dy = dx * b + dy * a;
40*3e12c5d1SDavid du Colombier 			dx = xnext;
41*3e12c5d1SDavid du Colombier 			vec(dx + xc, dy + yc);
42*3e12c5d1SDavid du Colombier 		}
43*3e12c5d1SDavid du Colombier 	}
44*3e12c5d1SDavid du Colombier }
45