double angle(point p) { #ifdef DBGANGLE printf("(%d, %d).(%d, %d) = ", x, y, p.x, p.y); double dotmod = (*this ^ p) / mod() / p.mod(); printf(" %.3lf --> %.3lf\n", dotmod, acos(dotmod)); #endif return acos((*this ^ p) / mod() / p.mod()); }
point reflect(point P,point direct,point A,point B,double mu) { double dot(point,point); point rotate(point,double); if (P==A || P==B) return(direct); if (dot(direct,A-B)<0) swap(A,B); point T=A-B; double angle=pi/2-acos(dot(direct,T)/direct.mod()/T.mod()); double theta=asin(sin(angle)/mu); if (direct*T>0) return(rotate(direct,theta-angle)); else return(rotate(direct,angle-theta)); }