#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 C leży na odcinku AB
bool punkt_w_odcinku(Punkt A, Punkt B, Punkt C) {
if (C.x >= min(A.x, B.x) && C.x <= max(A.x, B.x) &&
C.y >= min(A.y, B.y) && C.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 sie przecinaja";
else
cout << "odcinki sie nie przecinaja";
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFB1bmt0IHsKICAgIGRvdWJsZSB4LCB5Owp9OwoKLy8gZnVua2NqYSBvYmxpY3phasSFY2Egd3l6bmFjem5pawpkb3VibGUgZGV0KFB1bmt0IEEsIFB1bmt0IEIsIFB1bmt0IEMpIHsKICAgIHJldHVybiAoQi54IC0gQS54KSAqIChDLnkgLSBBLnkpIC0gKEIueSAtIEEueSkgKiAoQy54IC0gQS54KTsKfQoKLy8gc3ByYXdkemEgY3p5IHB1bmt0IEMgbGXFvHkgbmEgb2RjaW5rdSBBQgpib29sIHB1bmt0X3dfb2RjaW5rdShQdW5rdCBBLCBQdW5rdCBCLCBQdW5rdCBDKSB7CiAgICBpZiAoQy54ID49IG1pbihBLngsIEIueCkgJiYgQy54IDw9IG1heChBLngsIEIueCkgJiYKICAgICAgICBDLnkgPj0gbWluKEEueSwgQi55KSAmJiBDLnkgPD0gbWF4KEEueSwgQi55KSkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBmYWxzZTsKfQoKLy8gc3ByYXdkemEgY3p5IG9kY2lua2kgQUIgaSBDRCBzacSZIHByemVjaW5hasSFCmJvb2wgb2RjaW5raV9wcnplYyhQdW5rdCBBLCBQdW5rdCBCLCBQdW5rdCBDLCBQdW5rdCBEKSB7CiAgICBkb3VibGUgZDEgPSBkZXQoQSwgQiwgQyk7CiAgICBkb3VibGUgZDIgPSBkZXQoQSwgQiwgRCk7CiAgICBkb3VibGUgZDMgPSBkZXQoQywgRCwgQSk7CiAgICBkb3VibGUgZDQgPSBkZXQoQywgRCwgQik7CgogICAgaWYgKChkMSAqIGQyIDwgMCkgJiYgKGQzICogZDQgPCAwKSkKICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICBpZiAoZDEgPT0gMCAmJiBwdW5rdF93X29kY2lua3UoQSwgQiwgQykpIHJldHVybiB0cnVlOwogICAgaWYgKGQyID09IDAgJiYgcHVua3Rfd19vZGNpbmt1KEEsIEIsIEQpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChkMyA9PSAwICYmIHB1bmt0X3dfb2RjaW5rdShDLCBELCBBKSkgcmV0dXJuIHRydWU7CiAgICBpZiAoZDQgPT0gMCAmJiBwdW5rdF93X29kY2lua3UoQywgRCwgQikpIHJldHVybiB0cnVlOwoKICAgIHJldHVybiBmYWxzZTsKfQoKaW50IG1haW4oKSB7CiAgICBQdW5rdCBBID0gezEsMX07CiAgICBQdW5rdCBCID0gezQsNH07CiAgICBQdW5rdCBDID0gezIsMn07CiAgICBQdW5rdCBEID0gezEsNX07CgogICAgaWYgKG9kY2lua2lfcHJ6ZWMoQSwgQiwgQywgRCkpCiAgICAgICAgY291dCA8PCAib2RjaW5raSBzaWUgcHJ6ZWNpbmFqYSI7CiAgICBlbHNlCiAgICAgICAgY291dCA8PCAib2RjaW5raSBzaWUgbmllIHByemVjaW5hamEiOwoKICAgIHJldHVybiAwOwp9