Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <vector>
- #include <queue>
- #include <algorithm>
- #include <string>
- #include <stack>
- #include <set>
- #include <map>
- #define pii pair <int,int>
- #define pld pair <long double, long double>
- #define vec vector
- using namespace std;
- using ll = long long;
- using ld = long double;
- using db = double;
- void cv(vector <int> &v){
- for (auto x: v) cout<<x<<' ';
- cout<<"\n";
- }
- void cvl(vector <ll> &v){
- for (auto x: v) cout<<x<<' ';
- cout<<"\n";
- }
- void cvv(vector <vector <int> > &v){
- for (auto x: v) cv(x);
- cout<<"\n";
- }
- void cvb(vector <bool> v){
- for (bool x: v) cout<<x<<' ';
- cout<<"\n";
- }
- void cvs(vector <string> v){
- for (auto a: v){
- cout<<a<<"\n";
- }
- }
- struct Rvec{
- ld x, y;
- void mk(Rvec a, Rvec b){//ab
- x = b.x - a.x;
- y = b.y - a.y;
- }
- };
- ld vpr(Rvec a, Rvec b){//vector product
- return a.x * b.y - a.y * b.x;
- }
- int sgn(ld x){
- if (x < 0){
- return -1;
- }
- return 1;
- }
- /*
- Есть отрезки AB, CD
- 1.Проверяем, что C и D лежат по разные стороны от AB.
- Берем векторные произведения :
- 1)AC * AB
- 2)AD * AB
- сравниваем знаки -- если по разные стороны, то зрнаки различаются
- 2.Проверяем, что A и B лежат по разные стороны от CD
- Берем векторные произведения :
- 1)CA * CD
- 2)CB * CD
- сравниваем знаки -- если по разные стороны, то знаки различаются
- Если условия 1 и 2 выполнились, то отрезки пересекаются.
- Если зоть одно не выполнилось -- то НЕ ПЕРЕСЕКАЮТСЯ
- */
- bool inter(Rvec A, Rvec B, Rvec C, Rvec D){//AB with CD
- Rvec AB,AC,AD;
- bool a=0,b=0;
- AB.mk(A,B);
- AC.mk(A,C);
- AD.mk(A,D);
- if (sgn( vpr(AB, AC) ) == sgn( vpr(AB, AD) )){
- a=1;
- }
- Rvec CD, CA, CB;
- CD.mk(C, D);
- CA.mk(C, A);
- CB.mk(C, B);
- if (sgn(vpr(CD, CA)) == sgn(vpr(CD, CB))){
- b=1;
- }
- return a&&b;
- }
- int main()
- {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cout.precision(4);
- Rvec pnt;
- int n;
- cin>>n>>pnt.x>>pnt.y;
- vector <Rvec> v(n);
- for (int i = 0; i < n; ++i){
- cin>>v[i].x>>v[i].y;
- }
- }
- /*
- 3 2 3
- 1 1
- 10 2
- 2 8
- 3 2 3
- 1 1
- 10 2
- -10 -8
- 4 0 0
- 0 0
- 4 8
- 10 0
- 6 2
- */
Add Comment
Please, Sign In to add comment