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