#include <iostream> #include <math.h> using namespace std; #define eps 1e-8 #define zero(x) (((x)>0?(x):-(x))<eps) struct point3{double x,y,z;}; struct line3{point3 a,b;}; struct plane3{point3 a,b,c;};
point3 xmult(point3 u,point3 v){ point3 ret; ret.x=u.y*v.z-v.y*u.z; ret.y=u.z*v.x-u.x*v.z; ret.z=u.x*v.y-u.y*v.x; return ret; }
point3 subt(point3 u,point3 v){ point3 ret; ret.x=u.x-v.x; ret.y=u.y-v.y; ret.z=u.z-v.z; return ret; }
point3 pvec(plane3 s){ return xmult(subt(s.a,s.b),subt(s.b,s.c)); }
point3 intersection(line3 l,plane3 s){ point3 ret=pvec(s); double t=(ret.x*(s.a.x-l.a.x)+ret.y*(s.a.y-l.a.y)+ret.z*(s.a.z-l.a.z))/ (ret.x*(l.b.x-l.a.x)+ret.y*(l.b.y-l.a.y)+ret.z*(l.b.z-l.a.z)); ret.x=l.a.x+(l.b.x-l.a.x)*t; ret.y=l.a.y+(l.b.y-l.a.y)*t; ret.z=l.a.z+(l.b.z-l.a.z)*t; return ret; }
int main() { double a, b, m; double vx, vy, vz;
while(~scanf("%lf%lf%lf%lf%lf%lf", &a, &b, &m, &vx, &vy, &vz)) { /** 5 walls */ plane3 door, lw, rw, top, ground; door.a.x = 0, door.a.y = 0, door.a.z = 0; door.b.x = 1, door.b.y = 0, door.b.z = 0; door.c.x = 0, door.c.y = 0, door.c.z = 1; lw.a.x = 0, lw.a.y = 0, lw.a.z = 0; lw.b.x = 0, lw.b.y = 1, lw.b.z = 0; lw.c.x = 0, lw.c.y = 0, lw.c.z = 1; rw.a.x = a, rw.a.y = 0, rw.a.z = 0; rw.b.x = a, rw.b.y = 1, rw.b.z = 0; rw.c.x = a, rw.c.y = 0, rw.c.z = 1; ground.a.x = 0, ground.a.y = 0, ground.a.z = 0; ground.b.x = a, ground.b.y = 0, ground.b.z = 0; ground.c.x = a / 2, ground.c.y = m, ground.c.z = 0; top.a.x = 0, top.a.y = 0, top.a.z = b; top.b.x = a, top.b.y = 0, top.b.z = b; top.c.x = a / 2, top.c.y = m, top.c.z = b;
line3 l;
l.a.x = a / 2; l.a.y = m; l.a.z = 0;
l.b.x = (a / 2) + vx; l.b.y = m + vy; l.b.z = vz;
point3 v; v.x = vx, v.y = vy, v.z = vz;
point3 myans; while(true) { point3 ans, ans1, ans2, ans3, ans4; memset(&ans1, 0, sizeof(point3)); memset(&ans2, 0, sizeof(point3)); memset(&ans3, 0, sizeof(point3)); memset(&ans4, 0, sizeof(point3));
ans = intersection(l, door); if(ans.x >= 0 && ans.z >= 0 && ans.x <= a && ans.z <= b) { myans = ans; break; }
point3 totans;
if(v.x < 0) { ans1 = intersection(l, lw); if(ans1.z >= 0 && ans1.z <= b) { v.x = -v.x; totans = ans1; } } else if(v.x > 0) { ans2 = intersection(l, rw); if(ans2.z >= 0 && ans2.z <= b) { v.x = -v.x; totans = ans2; } }
if(v.z > 0) { ans3 = intersection(l, top); if(ans3.x >= 0 && ans3.x <= a) { v.z = -v.z; totans = ans3; } } else if(v.z < 0) { ans4 = intersection(l, ground); if(ans4.x >= 0 && ans4.x <= a) { v.z = -v.z; totans = ans4; } }
l.a = totans; l.b = totans; l.b.x += v.x; l.b.y += v.y; l.b.z += v.z; }
printf("%.10lf %.10lf\n", myans.x, myans.z); }
return 0; }
|