#include <iostream>
using namespace std;
struct Punkt {
double x, y;
};
// funkcja obliczająca wyznacznik
double det(Punkt a, Punkt b, Punkt c) {
return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
}
// sprawdza czy punkt p leży na odcinku ab
bool punkt_w_odcinku(Punkt a, Punkt b, Punkt p) {
if (p.x >= min(a.x, b.x) && p.x <= max(a.x, b.x) &&
p.y >= min(a.y, b.y) && p.y <= max(a.y, b.y))
return true;
return false;
}
// sprawdza czy odcinki ab i cd się przecinają
bool odcinki_przec(Punkt a, Punkt b, Punkt c, Punkt d) {
double d1 = det(a, b, c);
double d2 = det(a, b, d);
double d3 = det(c, d, a);
double d4 = det(c, d, b);
if ((d1 * d2 < 0) && (d3 * d4 < 0))
return true;
if (d1 == 0 && punkt_w_odcinku(a, b, c)) return true;
if (d2 == 0 && punkt_w_odcinku(a, b, d)) return true;
if (d3 == 0 && punkt_w_odcinku(c, d, a)) return true;
if (d4 == 0 && punkt_w_odcinku(c, d, b)) return true;
return false;
}
int main() {
Punkt A = {1,1};
Punkt B = {4,4};
Punkt C = {2,2};
Punkt D = {1,5};
if (odcinki_przec(A,B,C,D))
cout << "Odcinki się przecinają";
else
cout << "Odcinki się nie przecinają";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFB1bmt0IHsKICAgIGRvdWJsZSB4LCB5Owp9OwoKLy8gZnVua2NqYSBvYmxpY3phasSFY2Egd3l6bmFjem5pawpkb3VibGUgZGV0KFB1bmt0IGEsIFB1bmt0IGIsIFB1bmt0IGMpIHsKICAgIHJldHVybiAoYi54IC0gYS54KSAqIChjLnkgLSBhLnkpIC0gKGIueSAtIGEueSkgKiAoYy54IC0gYS54KTsKfQoKLy8gc3ByYXdkemEgY3p5IHB1bmt0IHAgbGXFvHkgbmEgb2RjaW5rdSBhYgpib29sIHB1bmt0X3dfb2RjaW5rdShQdW5rdCBhLCBQdW5rdCBiLCBQdW5rdCBwKSB7CiAgICBpZiAocC54ID49IG1pbihhLngsIGIueCkgJiYgcC54IDw9IG1heChhLngsIGIueCkgJiYKICAgICAgICBwLnkgPj0gbWluKGEueSwgYi55KSAmJiBwLnkgPD0gbWF4KGEueSwgYi55KSkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKfQoKLy8gc3ByYXdkemEgY3p5IG9kY2lua2kgYWIgaSBjZCBzacSZIHByemVjaW5hasSFCmJvb2wgb2RjaW5raV9wcnplYyhQdW5rdCBhLCBQdW5rdCBiLCBQdW5rdCBjLCBQdW5rdCBkKSB7CiAgICBkb3VibGUgZDEgPSBkZXQoYSwgYiwgYyk7CiAgICBkb3VibGUgZDIgPSBkZXQoYSwgYiwgZCk7CiAgICBkb3VibGUgZDMgPSBkZXQoYywgZCwgYSk7CiAgICBkb3VibGUgZDQgPSBkZXQoYywgZCwgYik7CgogICAgaWYgKChkMSAqIGQyIDwgMCkgJiYgKGQzICogZDQgPCAwKSkKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICBpZiAoZDEgPT0gMCAmJiBwdW5rdF93X29kY2lua3UoYSwgYiwgYykpIHJldHVybiB0cnVlOwogICAgaWYgKGQyID09IDAgJiYgcHVua3Rfd19vZGNpbmt1KGEsIGIsIGQpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChkMyA9PSAwICYmIHB1bmt0X3dfb2RjaW5rdShjLCBkLCBhKSkgcmV0dXJuIHRydWU7CiAgICBpZiAoZDQgPT0gMCAmJiBwdW5rdF93X29kY2lua3UoYywgZCwgYikpIHJldHVybiB0cnVlOwoKICAgIHJldHVybiBmYWxzZTsKfQoKaW50IG1haW4oKSB7CiAgICBQdW5rdCBBID0gezEsMX07CiAgICBQdW5rdCBCID0gezQsNH07CiAgICBQdW5rdCBDID0gezIsMn07CiAgICBQdW5rdCBEID0gezEsNX07CgogICAgaWYgKG9kY2lua2lfcHJ6ZWMoQSxCLEMsRCkpCiAgICAgICAgY291dCA8PCAiT2RjaW5raSBzacSZIHByemVjaW5hasSFIjsKICAgIGVsc2UKICAgICAgICBjb3V0IDw8ICJPZGNpbmtpIHNpxJkgbmllIHByemVjaW5hasSFIjsKCiAgICByZXR1cm4gMDsKfQ==