#include #include #include typedef complex Complex; #define eps 0.000000001 #define oo 1000000000 ifstream in("reflect.in"); int kase = 1; int i, n; double x, y; Complex m[30]; double radius[30]; Complex r, dr; double scalarproduct(Complex a, Complex b) { return real(a) * real(b) + imag(a) * imag(b); } Complex normalvector(Complex a) { if (abs(a) < eps) return 0; return (a / abs(a)) * Complex(0, 1); } double pldist(Complex p, Complex a, Complex b) { return fabs(scalarproduct(normalvector(b - a), a - p)); } int touch(int i) { if (!(pldist(m[i], r, r + dr) < radius[i] + eps)) return 0; Complex s = m[i] + normalvector(dr) * (scalarproduct(normalvector(dr), r - m[i])); if (scalarproduct(s - r, dr) > 0) return 1; else return 0; } main() { while (in >> n) { if (n == 0) return 0; cout << "Scene " << kase ++ << endl; for (i = 0; i < n; i++) { in >> x >> y >> radius[i]; m[i] = Complex(x, y); } in >> x >> y; r = Complex(x, y); in >> x >> y; dr = Complex(x, y); int count = 0; while (count < 11) { int hit = -1; double max = oo; Complex best_d; for (i = 0; i < n; i++) { // cout << r << ' ' << dr<< ' ' << i << ' ' << (touch(i)) << endl; if (touch(i)) { Complex s = m[i] + normalvector(dr) * (scalarproduct(normalvector(dr), r - m[i])); double d = pldist(m[i], r, r + dr); assert (r != s); Complex c_d = s - (s - r) / abs(r - s) * sqrt(radius[i] * radius[i] - d * d); double dist = abs(r - c_d); if (dist < max) { hit = i; max = dist; best_d = c_d; } } } if (hit == -1) { cout << "inf"; goto end; } else { dr = (best_d - m[hit]) * (best_d - m[hit]) / (-dr); r = best_d; } if (count < 10) cout << (hit + 1) << " "; count++; } cout << "..."; end: cout << endl; cout << endl; } }