Quipex icon

839

Quipex | PRO | 03/06/17 09:17:08 PM UTC | 0 ⭐ | 371 👁️ | Never ⏰ | []
C++ |

1.64 KB

|

None

|

0 👍

/

0 👎

#include <iostream>
 
using namespace std;
 
struct pt{long long x,y;};
double mltpl(pt a, pt b){ //Векторное умножение А*В
    return (a.x*b.y - b.x*a.y);
}
pt line(pt a, pt b){
    pt c;
    c.x = b.x - a.x;
    c.y = b.y - a.y;
    return c;
}
bool oneside(pt a, pt b, pt c, pt d){ //Лежат ли точки С и D на одной стороне от AB
    pt ab, ac, ad;
    ab = line(a, b);
    ac = line(a, c);
    ad = line(a, d);
    if((mltpl(ac, ab)>0 && mltpl(ad, ab)>0)||
       (mltpl(ac, ab)<0 && mltpl(ad, ab)<0)){
        return true;
    }
    return false;
}
bool lay(pt a,pt b,pt c){ //Лежат ли 3 точки на 1 прямой
    if((c.x - a.x)*(b.y - a.y)==(c.y - a.y)*(b.x - a.x))
        return true;
    return false;
}
bool intersect(int a,int b,int c,int d){ // Пересекаются ли AB и CD если лежат на 1 прямой
    if (a > b) swap(a, b);
    if (c > d) swap(c, d);
    return max(a, c) <= min(b, d);
}
int main()
{
    pt a,b,c,d;
    cin >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y >> d.x >> d.y;
 
    pt ab, ac, ad, cb, cd;
    ab = line(a, b);
    ac = line(a, c);
    ad = line(a, d);
    cb = line(c, b);
    cd = line(c, d);
    if (oneside(a, b, c, d)){
        cout << "No";
        return 0;
    }
    if (oneside(c, d, a, b)){
        cout << "No";
        return 0;
    }
    if ((lay(a,b,c) && lay(b,c,d)) == false){
        cout << "Yes";
        return 0;
    }
    if (intersect(a.x, b.x, c.x, d.x) && intersect(a.y, b.y, c.y, d.y)){
        cout << "Yes";
        return 0;
    }
    cout << "No";
    return 0;
}

Comments