fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. struct Punkt {
  5. double x, y;
  6. };
  7.  
  8. // funkcja obliczająca wyznacznik
  9. double det(Punkt a, Punkt b, Punkt c) {
  10. return (b.x - a.x) * (c.y - a.y) - (b.y - a.y) * (c.x - a.x);
  11. }
  12.  
  13. // sprawdza czy punkt p leży na odcinku ab
  14. bool punkt_w_odcinku(Punkt a, Punkt b, Punkt p) {
  15. if (p.x >= min(a.x, b.x) && p.x <= max(a.x, b.x) &&
  16. p.y >= min(a.y, b.y) && p.y <= max(a.y, b.y))
  17. return true;
  18. return false;
  19. }
  20.  
  21. // sprawdza czy odcinki ab i cd się przecinają
  22. bool odcinki_przec(Punkt a, Punkt b, Punkt c, Punkt d) {
  23. double d1 = det(a, b, c);
  24. double d2 = det(a, b, d);
  25. double d3 = det(c, d, a);
  26. double d4 = det(c, d, b);
  27.  
  28. if ((d1 * d2 < 0) && (d3 * d4 < 0))
  29. return true;
  30.  
  31. if (d1 == 0 && punkt_w_odcinku(a, b, c)) return true;
  32. if (d2 == 0 && punkt_w_odcinku(a, b, d)) return true;
  33. if (d3 == 0 && punkt_w_odcinku(c, d, a)) return true;
  34. if (d4 == 0 && punkt_w_odcinku(c, d, b)) return true;
  35.  
  36. return false;
  37. }
  38.  
  39. int main() {
  40. Punkt A = {1,1};
  41. Punkt B = {4,4};
  42. Punkt C = {2,2};
  43. Punkt D = {1,5};
  44.  
  45. if (odcinki_przec(A,B,C,D))
  46. cout << "Odcinki się przecinają";
  47. else
  48. cout << "Odcinki się nie przecinają";
  49.  
  50. return 0;
  51. }
Success #stdin #stdout 0.01s 5320KB
stdin
Standard input is empty
stdout
Odcinki się przecinają