#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); | |
} | |
} | |
} |