Untitled
unknown
c_cpp
2 years ago
3.0 kB
8
Indexable
#include "bits/stdc++.h"
using namespace std;
#ifdef LOCAL
#include "debug.h"
#else
#define debug(x...)
#endif
struct Point {
int x = 0, y = 0;
Point(int _x, int _y) {
x = _x;
y = _y;
}
};
struct Vector {
int x = 0, y = 0;
Vector(int _x, int _y) {
x = _x;
y = _y;
}
Vector(Point a) {
x = a.x;
y = a.y;
}
Vector(Point a, Point b) {
x = b.x - a.x;
y = b.y - a.y;
}
Vector operator+(const Vector &other) {
return {x + other.x, y + other.y};
}
Vector operator-(const Vector &other) {
return {x - other.x, y - other.y};
}
int operator*(const Vector &other) {
return x * other.x + y * other.y;
}
int operator^(const Vector &other) {
return x * other.y - other.x * y;
}
};
int dist2(Point a, Point b) {
return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
double dist(Point a, Point b) {
return sqrt(dist2(a, b));
}
int len2(Vector v) {
return v.x * v.x + v.y * v.y;
}
double len(Vector v) {
return sqrt(len2(v));
}
double dist_point_seg(Point a, Point c, Point d) {
Vector CD(c, d), CA(c, a), DC(d, c), DA(d, a);
if (CD * CA <= 0) {
return dist(a, c);
} else if (DC * DA <= 0) {
return dist(a, d);
} else {
return abs(CA ^ CD) / len(CD);
}
}
double dist_point_ray(Point a, Point c, Point d) {
Vector CD(c, d), CA(c, a), DC(d, c), DA(d, a);
if (CD * CA <= 0) {
return dist(a, c);
} else {
return abs(CA ^ CD) / len(CD);
}
}
double dist_point_line(Point a, Point c, Point d) {
Vector CD(c, d), CA(c, a);
return abs(CA ^ CD) / len(CD);
}
bool seg_inter(Point a, Point b, Point c, Point d) {
Vector AB(a, b), AC(a, c), AD(a, d), BA(b, a), BC(b, c), BD(b, d), CA(c, a), CB(c, b), CD(c, d), DA(d, a), DB(d, b), DC(d, c);
if ((CA ^ CD) == 0 || (CB ^ CD) == 0 || (AC ^ AB) == 0 || (AD ^ AB) == 0) {
return (AC * AD <= 0 || BC * BD <= 0 || CA * CB <= 0 || DA * DB <= 0);
} else {
if ((CA ^ CD) > 0) {
if ((CB ^ CD) > 0) return false;
} else {
if ((CB ^ CD) < 0) return false;
}
if ((AC ^ AB) > 0) {
if ((AD ^ AB) > 0) return false;
} else {
if ((AD ^ AB) < 0) return false;
}
return true;
}
}
void solve() {
cout.precision(10);
cout << fixed;
int xa, ya, xb, yb, xc, yc, xd, yd;
cin >> xa >> ya >> xb >> yb >> xc >> yc >> xd >> yd;
Point A(xa, ya), B(xb, yb), C(xc, yc), D(xd, yd);
cout << (seg_inter(A, B, C, D) ? "Yes" : "No");
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int tests = 1;
// cin >> tests;
while (tests--) {
solve();
}
return 0;
}Editor is loading...