fork(1) 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 C leży na odcinku AB
  14. bool punkt_w_odcinku(Punkt A, Punkt B, Punkt C) {
  15. if (C.x >= min(A.x, B.x) && C.x <= max(A.x, B.x) &&
  16. C.y >= min(A.y, B.y) && C.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 sie przecinaja";
  47. else
  48. cout << "odcinki sie nie przecinaja";
  49.  
  50. return 0;
  51. }
Success #stdin #stdout 0.01s 5292KB
stdin
Standard input is empty
stdout
odcinki sie przecinaja