ld mtime(pt u, pt v, ld t, pt s) { #define DD(x) (s.d2(u+v*(t+(x)))) #define OK(x) (DD(x) <= v2 * (x) * (x)) u.x -= s.x; u.y -= s.y; s = pt(0, 0); const ld v2 = ::v*::v; if (OK(0)) { return t; } u = u + v*t; ld A = v.d2() - v2; ld B = 2.0 * (u.x * v.x + u.y * v.y); ld C = u.d2(); ld D = B*B - 4.0 * A * C; D = sqrtl(max(D, 0.0l)); return t + (-B-D) / (2*A); // // ld t1 = (-B + D) / (2*A); // ld t2 = (-B - D) / (2*A); // // // cout << t1 << " " << t2 << endl; // assert(t1 >= 0 || t2 >= 0); // if (t1 > t2) swap(t1, t2); // return t + (t1 >= 0 ? t1 : t2); }