#include "mplot.h"/* arc plotting routine *//* from x1,y1 to x2,y2 *//* with center xc,yc and radius rr *//* integrates difference equation *//* negative rr draws counterclockwise */#define PI4 0.7854void rarc(double x1, double y1, double x2, double y2, double xc, double yc, double rr){ register double dx, dy, a, b; double ph, dph, rd, xnext; register int n; dx = x1 - xc; dy = y1 - yc; rd = sqrt(dx * dx + dy * dy); if (rd / e1->quantum < 1.0) { move(xc, yc); vec(xc, yc); return; } dph = acos(1.0 - (e1->quantum / rd)); if (dph > PI4) dph = PI4; ph=atan2((y2-yc),(x2 - xc)) - atan2(dy, dx); if (ph < 0) ph += 6.2832; if (rr < 0) ph = 6.2832 - ph; if (ph < dph) plotline(x1, y1, x2, y2); else { n = ph / dph; a = cos(dph); b = sin(dph); if (rr < 0) b = -b; move(x1, y1); while ((n--) >= 0) { xnext = dx * a - dy * b; dy = dx * b + dy * a; dx = xnext; vec(dx + xc, dy + yc); } }}
#include "mplot.h"
/* arc plotting routine */
/* from x1,y1 to x2,y2 */
/* with center xc,yc and radius rr */
/* integrates difference equation */
/* negative rr draws counterclockwise */
#define PI4 0.7854
void rarc(double x1, double y1, double x2, double y2, double xc, double yc, double rr){
register double dx, dy, a, b;
double ph, dph, rd, xnext;
register int n;
dx = x1 - xc;
dy = y1 - yc;
rd = sqrt(dx * dx + dy * dy);
if (rd / e1->quantum < 1.0) {
move(xc, yc);
vec(xc, yc);
return;
}
dph = acos(1.0 - (e1->quantum / rd));
if (dph > PI4)
dph = PI4;
ph=atan2((y2-yc),(x2 - xc)) - atan2(dy, dx);
if (ph < 0)
ph += 6.2832;
if (rr < 0)
ph = 6.2832 - ph;
if (ph < dph)
plotline(x1, y1, x2, y2);
else {
n = ph / dph;
a = cos(dph);
b = sin(dph);
if (rr < 0)
b = -b;
move(x1, y1);
while ((n--) >= 0) {
xnext = dx * a - dy * b;
dy = dx * b + dy * a;
dx = xnext;
vec(dx + xc, dy + yc);
}
}
}