//horizon #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define foreach(T,p,c) for(T p = (c).begin(); p != (c).end(); ++p) struct circle{ int x, y, r, id; circle(){} circle(int _x, int _y, int _r, int _id){ x = _x; y = _y; r = _r; id = _id; } }; vector Circles; int N; double X, Y, VX, VY; double Arg; circle LastHit; double check(circle c){ double XX = c.x - X; double YY = c.y - Y; double A = VX * VX + VY * VY; double B = -(XX * VX + YY * VY); double C = XX * XX + YY * YY - c.r * c.r; double B24AC = B * B - A * C; if(B24AC < 0){ return 0.0; } double t = (-B-sqrt(B24AC))/A; if(t < 0){ t = (-B+sqrt(B24AC))/A; if(t < 0){ return 0.0; } } LastHit = c; return t; } void refrect(circle c, double x, double y){ double Argc = atan2(y - c.y, x - c.x); Arg = M_PI - Arg + 2 * Argc; VX = cos(Arg); VY = sin(Arg); X = x; Y = y; } void solve(){ for(int i=0; i<11; i++){ double minT = 0.0; circle hit; foreach(vector::iterator, p, Circles){ double t = check(*p); if(t > 1e-10 && (minT == 0.0 || minT > t)){ minT = t; hit = LastHit; } } if(minT == 0.0){ cout << "inf" << endl; return; }else if(i < 10){ cout << hit.id << " "; }else{ cout << "..." << endl; return; } refrect(hit, X + minT*VX, Y + minT*VY); } cout << "..." << endl; } int main() { ifstream cin("reflect.txt"); for(int iii=1; cin >> N; iii++){ if(N == 0){ break; } Circles.clear(); for(int i=0; i> x >> y >> r; Circles.push_back(circle(x, y, r, i+1)); } cin >> X >> Y >> VX >> VY; cout << "Scene " << iii << endl; Arg = atan2(VY, VX); solve(); cout << endl; } }