Advertisement
Guest User

Untitled

a guest
Apr 24th, 2015
217
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.78 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. #define REP(i,n) for(int i=0;i<(int)(n);i++)
  4. #define ALL(x) (x).begin(),(x).end()
  5.  
  6. using namespace std;
  7.  
  8. typedef long double ld;
  9. typedef complex<ld> P;
  10. const ld eps = 1e-8, pi = acos(-1.0);
  11.  
  12. ld dot (P a, P b) { return real(conj(a) * b); }
  13. ld cross (P a, P b) { return imag(conj(a) * b); }
  14.  
  15. struct L{ P a, b; };
  16.  
  17. bool isis_ll(L l, L m) { return abs(cross(l.b - l.a, m.b - m.a)) > eps; }
  18.  
  19. P is_ll(L s, L t){
  20. P sv = s.b - s.a, tv = t.b - t.a;
  21. return s.a + sv * cross(tv, t.a - s.a) / cross(tv, sv);
  22. }
  23.  
  24. P proj(L l, P p) {
  25. ld t = dot(p - l.a, l.a - l.b) / norm(l.a - l.b);
  26. return l.a + t * (l.a - l.b);
  27. }
  28.  
  29. ld dist_lp(L l, P p) { return abs(p - proj(l, p)); }
  30.  
  31. ld width[128];
  32.  
  33. int main() {
  34. int N;
  35. ld W, H, R;
  36. while (cin >> W >> H >> N >> R, N) {
  37. vector<L> l1, l2;
  38. REP(i,N) {
  39. ld x1, y1, x2, y2, t;
  40. cin >> x1 >> y1 >> x2 >> y2 >> t;
  41. P p1 = P(x1, y1), p2 = P(x2, y2);
  42. P vec = p2 - p1; vec *= P(0, 1); vec /= abs(vec);
  43. width[i] = t;
  44. l1.push_back((L){p1, p2});
  45. l2.push_back((L){p1 + vec * (t + R), p2 + vec * (t + R)});
  46. l2.push_back((L){p1 - vec * (t + R), p2 - vec * (t + R)});
  47. }
  48. l2.push_back((L){P(R, R), P(W - R, R)});
  49. l2.push_back((L){P(W - R, H - R), P(W - R, R)});
  50. l2.push_back((L){P(R, R), P(R, H - R)});
  51. l2.push_back((L){P(W - R, H - R), P(R, H - R)});
  52. bool res = false;
  53. REP(i,l2.size()) REP(j,i) {
  54. if (!isis_ll(l2[i], l2[j])) continue;
  55. P p = is_ll(l2[i], l2[j]);
  56. if (p.real() < R - eps || p.imag() < R - eps ||
  57. p.real() > W - R + eps || p.imag() > H - R - eps) continue;
  58. bool flag = true;
  59. REP(k,l1.size()) if (dist_lp(l1[k], p) < width[k] + R - eps) flag = false;
  60. if (flag) res = true;
  61. }
  62. cout << (res ? "Yes" : "No") << endl;
  63. }
  64. return 0;
  65. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement