44 lines
968 B
C
44 lines
968 B
C
#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);
|
|
}
|
|
}
|
|
}
|