Index: alien_formats/easyeda/arc_testbench/arc_sed.c =================================================================== --- alien_formats/easyeda/arc_testbench/arc_sed.c (revision 39206) +++ alien_formats/easyeda/arc_testbench/arc_sed.c (revision 39207) @@ -9,12 +9,42 @@ b = __tmp__; \ } while(0) -static int arc_sed_90(double sx, double sy, double ex, double ey, double deg, double *cx, double *cy, double *r, double *srad, double *erad) +#define GEN_OUTPUT() \ +do { \ + *cx_out = cx; \ + *cy_out = cy; \ + *r_out = r; \ + *srad = atan2(sy - cy, sx - cx); \ + *erad = atan2(ey - cy, ex - cx); \ +} while(0) + +/* Optimized solver for 90 degree: consider the right triangle from + cx;cy, ex;ey, sx;sy. Knowing the chord length this yields r. Consider half + of this triangle, cutting from middle of the chord, also a right + triangle: chord side length known, hypotenuse is r -> distance from mx;my + to cx;cy. */ +static int arc_sed_90(double sx, double sy, double ex, double ey, double deg, double *cx_out, double *cy_out, double *r_out, double *srad, double *erad) { - return -5; + double r, cx, cy; + double mx, my, mr; + double chlen, chvx, chvy, chnx, chny, chl2; /* chord */ + + mx = (sx + ex) / 2.0; my = (sy + ey) / 2.0; + chvx = ex - sx; chvy = ey - sy; + chlen = sqrt(chvx*chvx + chvy*chvy); chl2 = chlen/2.0; + chvx /= chlen; chvy /= chlen; + chnx = -chvy; chny = chvx; + + r = sqrt(chlen*chl2); /* sqrt(chlen*chlen/2) */ + mr = sqrt(r*r - chl2*chl2); + cx = mx + chnx * mr; cy = my + chny * mr; + + GEN_OUTPUT(); + + return 0; } -static int arc_sed_180(double sx, double sy, double ex, double ey, double deg, double *cx, double *cy, double *r, double *srad, double *erad) +static int arc_sed_180(double sx, double sy, double ex, double ey, double deg, double *cx_out, double *cy_out, double *r_out, double *srad, double *erad) { return -5; } @@ -25,7 +55,7 @@ } /* Generic for angle smaller than 180; draw chord between start and end, the - middle of the cord is mx;my. Consider the right angle triangle mx;my + middle of the cord is mx;my. Consider the right triangle mx;my cx;cy and ex;ey; the central angle is deg/2, the side at chord is chl2. This yields radius and the side from mx;my to cx;cy. */ static int arc_sed_small(double sx, double sy, double ex, double ey, double deg, double *cx_out, double *cy_out, double *r_out, double *srad, double *erad) @@ -46,12 +76,7 @@ mr = sqrt(r*r - chl2*chl2); cx = mx + chnx * mr; cy = my + chny * mr; - *cx_out = cx; - *cy_out = cy; - *r_out = r; - - *srad = atan2(sy - cy, sx - cx); - *erad = atan2(ey - cy, ex - cx); + GEN_OUTPUT(); return 0; }