#include #include double slice (double r, double x) { double a = 2*acos (x/r); return r*r/2.0*(a-sin(a)); } double truncated_area (double r, double x, double w) { double y = sqrt(r*r-x*x); double xx = sqrt(r*r-w*w); if (y <= w) return slice (r, x); else return 2.0*w*(xx-x) + slice (r, xx); } int main (void) { int k, K; double w, h, r, d, a1, a2; double x1, x2, xl, xr, xm; double area; double pi = atan2 (0, -1); FILE *in = fopen ("sun.in", "r"); fscanf (in, "%d\n", &K); for (k = 1; k <= K; k ++) { float ww, hh, rr, dd, aa1, aa2; fscanf (in, "%f %f %f %f %f %f\n", &ww, &hh, &rr, &dd, &aa1, &aa2); w = (double) ww/2.0; h = (double) hh/2.0; r = (double) rr; d = (double) dd; a1 = (double) aa1; a2 = (double) aa2; x1 = d/tan(a2*pi/180.0); x2 = d/tan(a1*pi/180.0); xl = x2 - r; xr = x1 + r; xm = (x1+x2)/2.0; area = 0.0; if (xl < h && xr > -h) { if (xm >= -h) { if (xm <= h) area += truncated_area (r, x2-xm, w); else area += truncated_area (r, x2-h, w); if (xl < -h) area -= truncated_area (r, x2+h, w); } if (xm <= h) { if (xm >= -h) area += truncated_area (r, xm-x1, w); else area += truncated_area (r, -h-x1, w); if (xr > h) area -= truncated_area (r, h-x1, w); } } printf ("Data Set %d:\n", k); printf ("%.2f\%\n", 100.0000000001-25.0*area/(w*h)); } fclose (in); return 0; }