Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #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;
- }
Advertisement
Add Comment
Please, Sign In to add comment