fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct Punkt {
  5. double x, y;
  6. };
  7.  
  8. // funkcja obliczająca orientację trzech punktów
  9. int def(Punkt a, Punkt b, Punkt c) {
  10. double val = (b.y - a.y) * (c.x - b.x) - (b.x - a.x) * (c.y - b.y);
  11.  
  12. if (val == 0) return 0; // współliniowe
  13. if (val > 0) return 1; // zgodnie z ruchem wskazówek
  14. return 2; // przeciwnie
  15. }
  16.  
  17. // sprawdza czy punkt leży na odcinku
  18. bool punkt_w_odcinku(Punkt a, Punkt b, Punkt p) {
  19. if (p.x <= max(a.x, b.x) && p.x >= min(a.x, b.x) &&
  20. p.y <= max(a.y, b.y) && p.y >= min(a.y, b.y))
  21. return true;
  22. return false;
  23. }
  24.  
  25. // pomocnicza funkcja sprawdzająca orientacje
  26. bool przez(Punkt a, Punkt b, Punkt c, Punkt d) {
  27. int o1 = def(a, b, c);
  28. int o2 = def(a, b, d);
  29. int o3 = def(c, d, a);
  30. int o4 = def(c, d, b);
  31.  
  32. if (o1 != o2 && o3 != o4)
  33. return true;
  34.  
  35. if (o1 == 0 && punkt_w_odcinku(a, b, c)) return true;
  36. if (o2 == 0 && punkt_w_odcinku(a, b, d)) return true;
  37. if (o3 == 0 && punkt_w_odcinku(c, d, a)) return true;
  38. if (o4 == 0 && punkt_w_odcinku(c, d, b)) return true;
  39.  
  40. return false;
  41. }
  42.  
  43. // główna funkcja sprawdzająca przecięcie odcinków
  44. bool odcinki(Punkt a, Punkt b, Punkt c, Punkt d) {
  45. return przez(a, b, c, d);
  46. }
  47.  
  48. int main() {
  49. Punkt a, b, c, d;
  50.  
  51. cout << "Podaj wspolrzedne punktu A (x y): ";
  52. cin >> a.x >> a.y;
  53.  
  54. cout << "Podaj wspolrzedne punktu B (x y): ";
  55. cin >> b.x >> b.y;
  56.  
  57. cout << "Podaj wspolrzedne punktu C (x y): ";
  58. cin >> c.x >> c.y;
  59.  
  60. cout << "Podaj wspolrzedne punktu D (x y): ";
  61. cin >> d.x >> d.y;
  62.  
  63. if (odcinki(a, b, c, d))
  64. cout << "Odcinki sie przecinaja." << endl;
  65. else
  66. cout << "Odcinki sie nie przecinaja." << endl;
  67.  
  68. return 0;
  69. }
Success #stdin #stdout 0.01s 5316KB
stdin
Standard input is empty
stdout
Podaj wspolrzedne punktu A (x y): Podaj wspolrzedne punktu B (x y): Podaj wspolrzedne punktu C (x y): Podaj wspolrzedne punktu D (x y): Odcinki sie przecinaja.