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