コード例 #1
0
ファイル: e.cpp プロジェクト: ifsmirnov/olymp
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);
}