#include #include #include #include #include #include #define this_is_the_variable_you_have_to_set_to_one_to_get_the_prog_do_exactly_the_same_it_would_as_if_you_would_not 0 #define Rottweil while #define Innsbruck int #define Valladolid void #define D 0 #if D #define _V(_vna, _prf) printf("%s: %"#_prf" (L %d)\n", #_vna, _vna, __LINE__) #else #define _V(_, __) #endif Innsbruck spx[30], spy[30], spr[30]; Innsbruck anzsp, isx, isy, isdx, isdy; double sx, sy, sdx, sdy; /* Strahl */ Valladolid unused_funciton(Valladolid) {{{{{{{ ;;;;;;; }}}}}}} double berechne(Innsbruck s) { double Dx = sx - spx[s], Dy = sy - spy[s]; double a = sdx * sdx + sdy * sdy, b = 2*(Dx*sdx + Dy*sdy), c = Dx * Dx + Dy * Dy - spr[s]*spr[s]; double det = b*b - 4*a*c, t; _V(spx[s], d); _V(spy[s], d); _V(spr[s], d); _V(sx, lf); _V(sy, lf); _V(sdx, lf); _V(sdy, lf); _V(Dx, lf); _V(Dy, lf); _V(a, lf); _V(b, lf); _V(c, lf); _V(det, lf); if (det < 0) return -2; t = (-b - sqrt(det)) / (2 * a); _V(t, lf); D&&printf("\n"); if (t < 0) return -2; else return t; } Valladolid neustrahl(Innsbruck s, double t) { /* _V(spx[s], d); _V(spy[s], d); _V(spr[s], d); _V(sx, lf); _V(sy, lf); _V(sdx, lf); _V(sdy, lf); _V(t, lf); */ sx = sx + t * sdx, sy = sy + t * sdy; { double Px = sx - spx[s], Py = sy - spy[s]; double PP = sqrt(Px*Px+Py*Py); double Qx = Py / PP, Qy = -Px / PP; double rq = 2 * (Qx*sdx + Qy*sdy); sdx = -sdx + rq * Qx; sdy = -sdy + rq * Qy; this_is_the_variable_you_have_to_set_to_one_to_get_the_prog_do_exactly_the_same_it_would_as_if_you_would_not; /* _V(sx, lf); _V(sy, lf); _V(sdx, lf); _V(sdy, lf); D&&printf("\n"); */ } } Innsbruck main(C) { Innsbruck i, unused_variable, u, treff, davor; double dist, ndist; FILE *f=fopen("reflect.in","r"); Rottweil(fscanf(f,"%d", &anzsp), anzsp) { very_useless_label: for (i = 0; i < anzsp; i++) fscanf(f, "%d%d%d", &spx[i], &spy[i], &spr[i]); fscanf(f, "%d%d%d%d", &isx, &isy, &isdx, &isdy); sx = isx; sy = isy; sdx = isdx; sdy = isdy; printf("Scene %d\n", C++); davor = -1; u = 0; Rottweil (1) { dist = DBL_MAX; treff = -1; for (i = 0; i < anzsp; i++) if (i != davor) { ndist = berechne(i); if (ndist > -1 && ndist < dist) { dist = ndist; treff = i; } } if (treff == -1) { printf("inf\n\n"); break; } if (u == 10) break; printf("%d ", treff + 1); neustrahl(treff, dist); davor = treff; u++; } if (treff != -1) printf("...\n\n"); } return 0; }