#include #include using namespace std; const int TOO_MANY = 100; const int MAX_REFLECTION = 1000000; const double PI2 = 2*arg(complex(-1,0)); // 2d-vector typedef complex vec; istream& operator>>( istream& is, vec& p ) { int x,y; is>>x>>y; p=vec(x,y); return is; } double inner( const vec& a, const vec& b ) { return a.real()*b.real() + a.imag()*b.imag(); } double outer( const vec& a, const vec& b ) { return imag(conj(a)*b); } // mirror struct mirror { vec u, v; friend istream& operator>>( istream& is, mirror& m ) { return is >> m.u >> m.v; } void operator-=( const vec& o ) { u-=o; v-=o; } // reflection vec operator()( const vec& p ) { return conj((p-u)/(v-u))*(v-u)+u; } mirror operator()( const mirror& m ) { mirror m2 = {operator()(m.u), operator()(m.v)}; return m2; } // distance from the origin in the direction theta double dist( double theta ) { return outer(u, v-u)/outer(vec(cos(theta),sin(theta)),v-u); } bool cross( const vec& b ) { return outer(-u,v-u)*outer(b-u,v-u) < 0 && outer(u,b)*outer(v,b) < 0; } }; // arg_range struct arange { double m, M; // 0 to 4PI arange( const mirror& mr ) { m = arg(mr.u/mr.v)>0 ? arg(mr.v) : arg(mr.u); if(m<0) m+=PI2; M = abs(arg(mr.u/mr.v)) + m; } bool contains(double a) const { return m=PI2) M-=PI2; } }; int main() { for(vec p; cin>>p, p!=vec(0,0);) { mirror ma,mb; cin>>ma>>mb; ma-=p, mb-=p; // always move p to the origin mirror m1=ma, m2=mb; // mirror image of mirrors : frontier vec q1=ma(vec()), q2=mb(vec()); // pos of mirror image arange r1(ma), r2(mb); // range of arg where the mirror image must be int seen = 0; for(int i=0; i m1_.dist(r1.m) ) r1.m = r1.M; if( m2.dist(r2.m) > m2_.dist(r2.m) ) r2.m = r2.M; m1 = m1_, m2 = m2_; q1 = q1_, q2 = q2_; } (seen