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