#include #include #include #include #include using namespace std; #define FNAME "reflect.txt" #define cin fin ifstream fin(FNAME); #define NIL (-1) #define EPS FLT_EPSILON #define deq( a, b ) ( fabs((a) - (b)) < EPS ) #define dle(a, b) ( (a) < (b) || deq(a, b) ) class Circle { public: int x, y, r; }; void rotate( double &x, double &y, double rad ) { const double tx = x, ty = y; x = tx*cos(rad) - ty*sin(rad); y = tx*sin(rad) + ty*cos(rad); } int findNext( double cx, double cy, double dx, double dy, double &T, vector &C ) { T = DBL_MAX; int result = NIL; for ( int i = 0; i < C.size(); i++ ) { const double xi = C[i].x; const double yi = C[i].y; const double ri = C[i].r; const double a = dx*dx + dy*dy; const double b = 2*cx*dx + 2*cy*dy - 2*dx*xi - 2*dy*yi; const double c = cx*cx + cy*cy + xi*xi + yi*yi - 2*cx*xi - 2*cy*yi - ri*ri; const double D = b*b - 4*a*c; if ( D < 0 ) continue; const double t = (-b - sqrt(D)) / (2*a); if ( dle(t, 0) || t > T ) continue; result = i; T = t; } return result; } int main() { int ncircle; for ( int nt = 1; cin >> ncircle, ncircle; nt++ ) { vector C(ncircle); for ( int i = 0; i < ncircle; i++ ) cin >> C[i].x >> C[i].y >> C[i].r; double x, y, dx, dy; cin >> x >> y >> dx >> dy; cout << "Scene " << nt << endl; for ( int nth = 1; true; nth++ ) { double t; const int next = findNext(x, y, dx, dy, t, C); if ( nth > 1 ) cout << ' '; if ( next == NIL ) { cout << "inf"; break; } if ( nth == 11 ) { cout << "..."; break; } const double nx = x + dx*t; const double ny = y + dy*t; double rx = C[next].x - nx; double ry = C[next].y - ny; double px = x - nx; double py = y - ny; const double theta = atan2(ry, rx); rotate(px, py, -theta); py = -py; rotate(px, py, theta); x = nx, y = ny, dx = px, dy = py; cout << next+1; } cout << endl << endl; } return 0; }