xref: /plan9/sys/src/cmd/plot/libplot/rarc.c (revision 7dd7cddf99dd7472612f1413b4da293630e6b1bc)
13e12c5d1SDavid du Colombier #include "mplot.h"
23e12c5d1SDavid du Colombier /*		arc plotting routine		*/
33e12c5d1SDavid du Colombier /*		from x1,y1 to x2,y2		*/
43e12c5d1SDavid du Colombier /*	with center xc,yc and radius rr	*/
53e12c5d1SDavid du Colombier /*	integrates difference equation		*/
63e12c5d1SDavid du Colombier /*	negative rr draws counterclockwise	*/
73e12c5d1SDavid du Colombier #define PI4 0.7854
rarc(double x1,double y1,double x2,double y2,double xc,double yc,double rr)83e12c5d1SDavid du Colombier void rarc(double x1, double y1, double x2, double y2, double xc, double yc, double rr){
93e12c5d1SDavid du Colombier 	register double dx, dy, a, b;
103e12c5d1SDavid du Colombier 	double	ph, dph, rd, xnext;
113e12c5d1SDavid du Colombier 	register int	n;
123e12c5d1SDavid du Colombier 	dx = x1 - xc;
133e12c5d1SDavid du Colombier 	dy = y1 - yc;
143e12c5d1SDavid du Colombier 	rd = sqrt(dx * dx + dy * dy);
153e12c5d1SDavid du Colombier 	if (rd / e1->quantum < 1.0) {
163e12c5d1SDavid du Colombier 		move(xc, yc);
173e12c5d1SDavid du Colombier 		vec(xc, yc);
183e12c5d1SDavid du Colombier 		return;
193e12c5d1SDavid du Colombier 	}
203e12c5d1SDavid du Colombier 	dph = acos(1.0 - (e1->quantum / rd));
213e12c5d1SDavid du Colombier 	if (dph > PI4)
223e12c5d1SDavid du Colombier 		dph = PI4;
233e12c5d1SDavid du Colombier 	ph=atan2((y2-yc),(x2 - xc)) - atan2(dy, dx);
243e12c5d1SDavid du Colombier 	if (ph < 0)
253e12c5d1SDavid du Colombier 		ph += 6.2832;
263e12c5d1SDavid du Colombier 	if (rr < 0)
273e12c5d1SDavid du Colombier 		ph = 6.2832 - ph;
283e12c5d1SDavid du Colombier 	if (ph < dph)
29*7dd7cddfSDavid du Colombier 		plotline(x1, y1, x2, y2);
303e12c5d1SDavid du Colombier 	else {
313e12c5d1SDavid du Colombier 		n = ph / dph;
323e12c5d1SDavid du Colombier 		a = cos(dph);
333e12c5d1SDavid du Colombier 		b = sin(dph);
343e12c5d1SDavid du Colombier 		if (rr < 0)
353e12c5d1SDavid du Colombier 			b = -b;
363e12c5d1SDavid du Colombier 		move(x1, y1);
373e12c5d1SDavid du Colombier 		while ((n--) >= 0) {
383e12c5d1SDavid du Colombier 			xnext = dx * a - dy * b;
393e12c5d1SDavid du Colombier 			dy = dx * b + dy * a;
403e12c5d1SDavid du Colombier 			dx = xnext;
413e12c5d1SDavid du Colombier 			vec(dx + xc, dy + yc);
423e12c5d1SDavid du Colombier 		}
433e12c5d1SDavid du Colombier 	}
443e12c5d1SDavid du Colombier }
45