1*3e12c5d1SDavid du Colombier #include "mplot.h" 2*3e12c5d1SDavid du Colombier /* arc plotting routine */ 3*3e12c5d1SDavid du Colombier /* from x1,y1 to x2,y2 */ 4*3e12c5d1SDavid du Colombier /* with center xc,yc and radius rr */ 5*3e12c5d1SDavid du Colombier /* integrates difference equation */ 6*3e12c5d1SDavid du Colombier /* negative rr draws counterclockwise */ 7*3e12c5d1SDavid du Colombier #define PI4 0.7854 8*3e12c5d1SDavid du Colombier void rarc(double x1, double y1, double x2, double y2, double xc, double yc, double rr){ 9*3e12c5d1SDavid du Colombier register double dx, dy, a, b; 10*3e12c5d1SDavid du Colombier double ph, dph, rd, xnext; 11*3e12c5d1SDavid du Colombier register int n; 12*3e12c5d1SDavid du Colombier dx = x1 - xc; 13*3e12c5d1SDavid du Colombier dy = y1 - yc; 14*3e12c5d1SDavid du Colombier rd = sqrt(dx * dx + dy * dy); 15*3e12c5d1SDavid du Colombier if (rd / e1->quantum < 1.0) { 16*3e12c5d1SDavid du Colombier move(xc, yc); 17*3e12c5d1SDavid du Colombier vec(xc, yc); 18*3e12c5d1SDavid du Colombier return; 19*3e12c5d1SDavid du Colombier } 20*3e12c5d1SDavid du Colombier dph = acos(1.0 - (e1->quantum / rd)); 21*3e12c5d1SDavid du Colombier if (dph > PI4) 22*3e12c5d1SDavid du Colombier dph = PI4; 23*3e12c5d1SDavid du Colombier ph=atan2((y2-yc),(x2 - xc)) - atan2(dy, dx); 24*3e12c5d1SDavid du Colombier if (ph < 0) 25*3e12c5d1SDavid du Colombier ph += 6.2832; 26*3e12c5d1SDavid du Colombier if (rr < 0) 27*3e12c5d1SDavid du Colombier ph = 6.2832 - ph; 28*3e12c5d1SDavid du Colombier if (ph < dph) 29*3e12c5d1SDavid du Colombier line(x1, y1, x2, y2); 30*3e12c5d1SDavid du Colombier else { 31*3e12c5d1SDavid du Colombier n = ph / dph; 32*3e12c5d1SDavid du Colombier a = cos(dph); 33*3e12c5d1SDavid du Colombier b = sin(dph); 34*3e12c5d1SDavid du Colombier if (rr < 0) 35*3e12c5d1SDavid du Colombier b = -b; 36*3e12c5d1SDavid du Colombier move(x1, y1); 37*3e12c5d1SDavid du Colombier while ((n--) >= 0) { 38*3e12c5d1SDavid du Colombier xnext = dx * a - dy * b; 39*3e12c5d1SDavid du Colombier dy = dx * b + dy * a; 40*3e12c5d1SDavid du Colombier dx = xnext; 41*3e12c5d1SDavid du Colombier vec(dx + xc, dy + yc); 42*3e12c5d1SDavid du Colombier } 43*3e12c5d1SDavid du Colombier } 44*3e12c5d1SDavid du Colombier } 45