#include <iostream>
using namespace std;
struct Punkt {
double x, y;
} ;
// funkcja obliczająca orientację trzech punktów
int def( Punkt a, Punkt b, Punkt c) {
double val = ( b.y - a.y ) * ( c.x - b.x ) - ( b.x - a.x ) * ( c.y - b.y ) ;
if ( val == 0 ) return 0 ; // współliniowe
if ( val > 0 ) return 1 ; // zgodnie z ruchem wskazówek
return 2 ; // przeciwnie
}
// sprawdza czy punkt leży na odcinku
bool punkt_w_odcinku( Punkt a, Punkt b, Punkt p) {
if ( p.x <= max( a.x , b.x ) && p.x >= min( a.x , b.x ) &&
p.y <= max( a.y , b.y ) && p.y >= min( a.y , b.y ) )
return true ;
return false ;
}
// pomocnicza funkcja sprawdzająca orientacje
bool przez( Punkt a, Punkt b, Punkt c, Punkt d) {
int o1 = def( a, b, c) ;
int o2 = def( a, b, d) ;
int o3 = def( c, d, a) ;
int o4 = def( c, d, b) ;
if ( o1 ! = o2 && o3 ! = o4)
return true ;
if ( o1 == 0 && punkt_w_odcinku( a, b, c) ) return true ;
if ( o2 == 0 && punkt_w_odcinku( a, b, d) ) return true ;
if ( o3 == 0 && punkt_w_odcinku( c, d, a) ) return true ;
if ( o4 == 0 && punkt_w_odcinku( c, d, b) ) return true ;
return false ;
}
// główna funkcja sprawdzająca przecięcie odcinków
bool odcinki( Punkt a, Punkt b, Punkt c, Punkt d) {
return przez( a, b, c, d) ;
}
int main( ) {
Punkt a, b, c, d;
cout << "Podaj wspolrzedne punktu A (x y): " ;
cin >> a.x >> a.y ;
cout << "Podaj wspolrzedne punktu B (x y): " ;
cin >> b.x >> b.y ;
cout << "Podaj wspolrzedne punktu C (x y): " ;
cin >> c.x >> c.y ;
cout << "Podaj wspolrzedne punktu D (x y): " ;
cin >> d.x >> d.y ;
if ( odcinki( a, b, c, d) )
cout << "Odcinki sie przecinaja." << endl;
else
cout << "Odcinki sie nie przecinaja." << endl;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IFB1bmt0IHsKICAgIGRvdWJsZSB4LCB5Owp9OwoKLy8gZnVua2NqYSBvYmxpY3phasSFY2Egb3JpZW50YWNqxJkgdHJ6ZWNoIHB1bmt0w7N3CmludCBkZWYoUHVua3QgYSwgUHVua3QgYiwgUHVua3QgYykgewogICAgZG91YmxlIHZhbCA9IChiLnkgLSBhLnkpICogKGMueCAtIGIueCkgLSAoYi54IC0gYS54KSAqIChjLnkgLSBiLnkpOwoKICAgIGlmICh2YWwgPT0gMCkgcmV0dXJuIDA7ICAgICAgLy8gd3Nww7PFgmxpbmlvd2UKICAgIGlmICh2YWwgPiAwKSByZXR1cm4gMTsgICAgICAgLy8gemdvZG5pZSB6IHJ1Y2hlbSB3c2thesOzd2VrCiAgICByZXR1cm4gMjsgICAgICAgICAgICAgICAgICAgIC8vIHByemVjaXduaWUKfQoKLy8gc3ByYXdkemEgY3p5IHB1bmt0IGxlxbx5IG5hIG9kY2lua3UKYm9vbCBwdW5rdF93X29kY2lua3UoUHVua3QgYSwgUHVua3QgYiwgUHVua3QgcCkgewogICAgaWYgKHAueCA8PSBtYXgoYS54LCBiLngpICYmIHAueCA+PSBtaW4oYS54LCBiLngpICYmCiAgICAgICAgcC55IDw9IG1heChhLnksIGIueSkgJiYgcC55ID49IG1pbihhLnksIGIueSkpCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gZmFsc2U7Cn0KCi8vIHBvbW9jbmljemEgZnVua2NqYSBzcHJhd2R6YWrEhWNhIG9yaWVudGFjamUKYm9vbCBwcnpleihQdW5rdCBhLCBQdW5rdCBiLCBQdW5rdCBjLCBQdW5rdCBkKSB7CiAgICBpbnQgbzEgPSBkZWYoYSwgYiwgYyk7CiAgICBpbnQgbzIgPSBkZWYoYSwgYiwgZCk7CiAgICBpbnQgbzMgPSBkZWYoYywgZCwgYSk7CiAgICBpbnQgbzQgPSBkZWYoYywgZCwgYik7CgogICAgaWYgKG8xICE9IG8yICYmIG8zICE9IG80KQogICAgICAgIHJldHVybiB0cnVlOwoKICAgIGlmIChvMSA9PSAwICYmIHB1bmt0X3dfb2RjaW5rdShhLCBiLCBjKSkgcmV0dXJuIHRydWU7CiAgICBpZiAobzIgPT0gMCAmJiBwdW5rdF93X29kY2lua3UoYSwgYiwgZCkpIHJldHVybiB0cnVlOwogICAgaWYgKG8zID09IDAgJiYgcHVua3Rfd19vZGNpbmt1KGMsIGQsIGEpKSByZXR1cm4gdHJ1ZTsKICAgIGlmIChvNCA9PSAwICYmIHB1bmt0X3dfb2RjaW5rdShjLCBkLCBiKSkgcmV0dXJuIHRydWU7CgogICAgcmV0dXJuIGZhbHNlOwp9CgovLyBnxYLDs3duYSBmdW5rY2phIHNwcmF3ZHphasSFY2EgcHJ6ZWNpxJljaWUgb2RjaW5rw7N3CmJvb2wgb2RjaW5raShQdW5rdCBhLCBQdW5rdCBiLCBQdW5rdCBjLCBQdW5rdCBkKSB7CiAgICByZXR1cm4gcHJ6ZXooYSwgYiwgYywgZCk7Cn0KCmludCBtYWluKCkgewogICAgUHVua3QgYSwgYiwgYywgZDsKCiAgICBjb3V0IDw8ICJQb2RhaiB3c3BvbHJ6ZWRuZSBwdW5rdHUgQSAoeCB5KTogIjsKICAgIGNpbiA+PiBhLnggPj4gYS55OwoKICAgIGNvdXQgPDwgIlBvZGFqIHdzcG9scnplZG5lIHB1bmt0dSBCICh4IHkpOiAiOwogICAgY2luID4+IGIueCA+PiBiLnk7CgogICAgY291dCA8PCAiUG9kYWogd3Nwb2xyemVkbmUgcHVua3R1IEMgKHggeSk6ICI7CiAgICBjaW4gPj4gYy54ID4+IGMueTsKCiAgICBjb3V0IDw8ICJQb2RhaiB3c3BvbHJ6ZWRuZSBwdW5rdHUgRCAoeCB5KTogIjsKICAgIGNpbiA+PiBkLnggPj4gZC55OwoKICAgIGlmIChvZGNpbmtpKGEsIGIsIGMsIGQpKQogICAgICAgIGNvdXQgPDwgIk9kY2lua2kgc2llIHByemVjaW5hamEuIiA8PCBlbmRsOwogICAgZWxzZQogICAgICAgIGNvdXQgPDwgIk9kY2lua2kgc2llIG5pZSBwcnplY2luYWphLiIgPDwgZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==