fork download
  1. //g++ 4.9.3
  2.  
  3. #include <iostream>
  4. #include <cmath>
  5.  
  6. bool cross(float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4){
  7.  
  8. float maxx1 = std::max(x1, x2), maxy1 = std::max(y1, y2);
  9. float minx1 = std::min(x1, x2), miny1 = std::min(y1, y2);
  10. float maxx2 = std::max(x3, x4), maxy2 = std::max(y3, x4);
  11. float minx2 = std::min(x3, x4), miny2 = std::min(y3, x4);
  12.  
  13. if (minx1 > maxx2 || maxx1 < minx2 || miny1 > maxy2 || maxy1 < miny2)
  14. return false; // Момент, кда линии имеют одну общую вершину...
  15.  
  16.  
  17. float dx1 = x2-x1, dy1 = y2-y1; // Длина проекций первой линии на ось x и y
  18. float dx2 = x4-x3, dy2 = y4-y3; // Длина проекций второй линии на ось x и y
  19. float dxx = x1-x3, dyy = y1-y3;
  20. float div, mul;
  21.  
  22.  
  23. if ((div = (dy2*dx1 - dx2*dy1)) == 0)
  24. return false; // Линии параллельны...
  25.  
  26. if (div > 0) {
  27. if ((mul = (dx1*dyy - dy1*dxx)) < 0 || mul > div)
  28. return false; // Первый отрезок пересекается за своими границами...
  29. if ((mul = (dx2*dyy - dy2*dxx)) < 0 || mul > div)
  30. return false; // Второй отрезок пересекается за своими границами...
  31. }
  32.  
  33. if ((mul = -(dx1*dyy - dy1*dxx)) < 0 || mul > -div)
  34. return false; // Первый отрезок пересекается за своими границами...
  35. if ((mul = -(dx2*dyy - dy2*dxx)) < 0 || mul > -div)
  36. return false; // Второй отрезок пересекается за своими границами...
  37.  
  38. return true;
  39. }
  40.  
  41. bool transection (double ax1, double ay1, double ax2, double ay2, double bx1, double by1, double bx2, double by2)
  42. {
  43. double v1=(bx2-bx1)*(ay1-by1)-(by2-by1)*(ax1-bx1);
  44. double v2=(bx2-bx1)*(ay2-by1)-(by2-by1)*(ax2-bx1);
  45. double v3=(ax2-ax1)*(by1-ay1)-(ay2-ay1)*(bx1-ax1);
  46. double v4=(ax2-ax1)*(by2-ay1)-(ay2-ay1)*(bx2-ax1);
  47. return ((v1*v2<0) && (v3*v4<0));
  48. }
  49.  
  50. int main()
  51. {
  52. std::cout << (cross(1, 1, 5, 5, 1, 2, 3, 1)? "true" : "false") << std::endl;
  53. std::cout << (cross(1, 1, 1, 1, 1, 1, 1, 1)? "true" : "false") << std::endl;
  54. std::cout << (cross(1, 1, 4, 1, 1, 1, 4, 1)? "true" : "false") << std::endl;
  55. std::cout << (cross(0, 0, 0, 2, 0, 1, 1, 1)? "true" : "false") << std::endl;
  56. std::cout << (transection(1, 1, 5, 5, 1, 2, 3, 1)? "true" : "false") << std::endl;
  57. std::cout << (transection(1, 1, 1, 1, 1, 1, 1, 1)? "true" : "false") << std::endl;
  58. std::cout << (transection(1, 1, 4, 1, 1, 1, 4, 1)? "true" : "false") << std::endl;
  59. std::cout << (transection(0, 0, 0, 2, 0, 1, 1, 1)? "true" : "false") << std::endl;
  60.  
  61.  
  62.  
  63. return 0;
  64. }
Success #stdin #stdout 0s 3468KB
stdin
Standard input is empty
stdout
true
false
false
true
true
false
false
false