Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define REP(i,n) for(int i=0;i<(int)(n);i++)
- #define ALL(x) (x).begin(),(x).end()
- using namespace std;
- typedef long double ld;
- typedef complex<ld> P;
- const ld eps = 1e-8, pi = acos(-1.0);
- ld dot (P a, P b) { return real(conj(a) * b); }
- ld cross (P a, P b) { return imag(conj(a) * b); }
- struct L{ P a, b; };
- bool isis_ll(L l, L m) { return abs(cross(l.b - l.a, m.b - m.a)) > eps; }
- P is_ll(L s, L t){
- P sv = s.b - s.a, tv = t.b - t.a;
- return s.a + sv * cross(tv, t.a - s.a) / cross(tv, sv);
- }
- P proj(L l, P p) {
- ld t = dot(p - l.a, l.a - l.b) / norm(l.a - l.b);
- return l.a + t * (l.a - l.b);
- }
- ld dist_lp(L l, P p) { return abs(p - proj(l, p)); }
- ld width[128];
- int main() {
- int N;
- ld W, H, R;
- while (cin >> W >> H >> N >> R, N) {
- vector<L> l1, l2;
- REP(i,N) {
- ld x1, y1, x2, y2, t;
- cin >> x1 >> y1 >> x2 >> y2 >> t;
- P p1 = P(x1, y1), p2 = P(x2, y2);
- P vec = p2 - p1; vec *= P(0, 1); vec /= abs(vec);
- width[i] = t;
- l1.push_back((L){p1, p2});
- l2.push_back((L){p1 + vec * (t + R), p2 + vec * (t + R)});
- l2.push_back((L){p1 - vec * (t + R), p2 - vec * (t + R)});
- }
- l2.push_back((L){P(R, R), P(W - R, R)});
- l2.push_back((L){P(W - R, H - R), P(W - R, R)});
- l2.push_back((L){P(R, R), P(R, H - R)});
- l2.push_back((L){P(W - R, H - R), P(R, H - R)});
- bool res = false;
- REP(i,l2.size()) REP(j,i) {
- if (!isis_ll(l2[i], l2[j])) continue;
- P p = is_ll(l2[i], l2[j]);
- if (p.real() < R - eps || p.imag() < R - eps ||
- p.real() > W - R + eps || p.imag() > H - R - eps) continue;
- bool flag = true;
- REP(k,l1.size()) if (dist_lp(l1[k], p) < width[k] + R - eps) flag = false;
- if (flag) res = true;
- }
- cout << (res ? "Yes" : "No") << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement