Korotkodul

геома

Apr 1st, 2022 (edited)
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.55 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <vector>
  4. #include <queue>
  5. #include <algorithm>
  6. #include <string>
  7. #include <stack>
  8. #include <set>
  9. #include <map>
  10. #define pii pair <int,int>
  11. #define pld pair <long double, long double>
  12. #define vec vector
  13. using namespace std;
  14. using ll = long long;
  15. using ld = long double;
  16. using db = double;
  17. void cv(vector <int> &v){
  18.     for (auto x: v) cout<<x<<' ';
  19.     cout<<"\n";
  20. }
  21.  
  22. void cvl(vector <ll> &v){
  23.     for (auto x: v) cout<<x<<' ';
  24.     cout<<"\n";
  25. }
  26.  
  27.  
  28. void cvv(vector <vector <int> > &v){
  29.     for (auto x: v) cv(x);
  30.     cout<<"\n";
  31. }
  32.  
  33. void cvb(vector <bool> v){
  34.     for (bool x: v) cout<<x<<' ';
  35.     cout<<"\n";
  36. }
  37.  
  38. void cvs(vector <string>  v){
  39.     for (auto a: v){
  40.         cout<<a<<"\n";
  41.     }
  42. }
  43.  
  44.  
  45. struct Rvec{
  46.     ld x, y;
  47.     void mk(Rvec a, Rvec b){//ab
  48.         x = b.x - a.x;
  49.         y = b.y - a.y;
  50.     }
  51. };
  52.  
  53.  
  54. ld vpr(Rvec a, Rvec b){//vector product
  55.     return a.x * b.y - a.y * b.x;
  56. }
  57.  
  58. int sgn(ld x){
  59.     if (x < 0){
  60.         return -1;
  61.     }
  62.     return 1;
  63. }
  64.  
  65. /*
  66. Есть отрезки AB, CD
  67.  
  68. 1.Проверяем, что C и D лежат по разные стороны  от AB.
  69. Берем векторные произведения :
  70. 1)AC * AB
  71. 2)AD * AB
  72. сравниваем знаки -- если по разные стороны, то зрнаки различаются
  73.  
  74.  
  75.  
  76. 2.Проверяем, что A и B лежат по разные стороны от CD
  77. Берем векторные произведения :
  78. 1)CA * CD
  79. 2)CB * CD
  80. сравниваем знаки -- если по разные стороны, то знаки различаются
  81.  
  82.  
  83. Если условия 1 и 2 выполнились, то отрезки пересекаются.
  84.  
  85. Если зоть одно не выполнилось -- то НЕ ПЕРЕСЕКАЮТСЯ
  86.  
  87. */
  88.  
  89. bool inter(Rvec A, Rvec B, Rvec C, Rvec D){//AB with CD
  90.     Rvec AB,AC,AD;
  91.     bool a=0,b=0;
  92.     AB.mk(A,B);
  93.     AC.mk(A,C);
  94.     AD.mk(A,D);
  95.     if (sgn( vpr(AB, AC) ) == sgn( vpr(AB, AD) )){
  96.         a=1;
  97.     }
  98.     Rvec CD, CA, CB;
  99.     CD.mk(C, D);
  100.     CA.mk(C, A);
  101.     CB.mk(C, B);
  102.     if (sgn(vpr(CD, CA)) == sgn(vpr(CD, CB))){
  103.         b=1;
  104.     }
  105.     return a&&b;
  106. }
  107.  
  108.  
  109. int main()
  110. {
  111.     ios::sync_with_stdio(0);
  112.     cin.tie(0);
  113.     cout.tie(0);
  114.     cout.precision(4);
  115.     Rvec pnt;
  116.     int n;
  117.     cin>>n>>pnt.x>>pnt.y;
  118.     vector <Rvec> v(n);
  119.     for (int i = 0; i < n; ++i){
  120.         cin>>v[i].x>>v[i].y;
  121.     }
  122.  
  123. }
  124. /*
  125. 3 2 3
  126. 1 1
  127. 10 2
  128. 2 8
  129.  
  130. 3 2 3
  131. 1 1
  132. 10 2
  133. -10 -8
  134.  
  135.  
  136. 4 0 0
  137. 0 0
  138. 4 8
  139. 10 0
  140. 6 2
  141. */
  142.  
Add Comment
Please, Sign In to add comment