fork download
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. double det(double xA, double yA, double xB, double yB, double xC, double yC)
  5. {
  6. return (xB - xA) * (yC - yA) - (yB - yA) * (xC - xA);
  7. }
  8.  
  9. bool punkt_w_odcinku(double xA, double yA, double xB, double yB, double xP, double yP)
  10. {
  11. if (xP >= min(xA, xB) && xP <= max(xA, xB) &&
  12. yP >= min(yA, yB) && yP <= max(yA, yB))
  13. return true;
  14. return false;
  15. }
  16.  
  17. bool odcinek_przec(double xA, double yA, double xB, double yB,
  18. double xC, double yC, double xD, double yD)
  19. {
  20. double d1 = det(xA, yA, xB, yB, xC, yC);
  21. double d2 = det(xA, yA, xB, yB, xD, yD);
  22. double d3 = det(xC, yC, xD, yD, xA, yA);
  23. double d4 = det(xC, yC, xD, yD, xB, yB);
  24.  
  25. if (d1 * d2 < 0 && d3 * d4 < 0)
  26. return true;
  27.  
  28. if (d1 == 0 && punkt_w_odcinku(xA, yA, xB, yB, xC, yC)) return true;
  29. if (d2 == 0 && punkt_w_odcinku(xA, yA, xB, yB, xD, yD)) return true;
  30. if (d3 == 0 && punkt_w_odcinku(xC, yC, xD, yD, xA, yA)) return true;
  31. if (d4 == 0 && punkt_w_odcinku(xC, yC, xD, yD, xB, yB)) return true;
  32.  
  33. return false;
  34. }
  35.  
  36. int main()
  37. {
  38. double xA = 1, yA = 1;
  39. double xB = 4, yB = 4;
  40. double xC = 2, yC = 2;
  41. double xD = 1, yD = 5;
  42.  
  43. if (odcinek_przec(xA, yA, xB, yB, xC, yC, xD, yD))
  44. cout << "Odcinki sie przecinaja" << endl;
  45. else
  46. cout << "Odcinki sie nie przecinaja" << endl;
  47.  
  48. return 0;
  49. }
Success #stdin #stdout 0.01s 5288KB
stdin
Standard input is empty
stdout
Odcinki sie przecinaja