Advertisement
ProgNeo

Untitled

Jun 18th, 2021
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <iomanip>
  3. #include <vector>
  4. #include <string>
  5.  
  6. using namespace std;
  7.  
  8. struct Point
  9. {
  10.     float x;
  11.     float y;
  12. };
  13.  
  14. struct Line
  15. {
  16.     Point p1;
  17.     Point p2;
  18. };
  19.  
  20. bool on_segment(Point p, Point q, Point r)
  21. {
  22.     if (q.x <= max(p.x, r.x) && q.x >= min(p.x, r.x) &&
  23.         q.y <= max(p.y, r.y) && q.y >= min(p.y, r.y))
  24.         return true;
  25.  
  26.     return false;
  27. }
  28.  
  29. int orientation(Point p, Point q, Point r)
  30. {
  31.     int val = (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y);
  32.     if (val == 0) return 0;
  33.  
  34.     return (val > 0) ? 1 : 2;
  35. }
  36.  
  37. bool do_intersect(Point p1, Point q1, Point p2, Point q2)
  38. {
  39.     if ((p1.x == q2.x && p1.y == q2.y) || (q1.x == p2.x && q1.y == p2.y)) return false;
  40.  
  41.     int o1 = orientation(p1, q1, p2);
  42.     int o2 = orientation(p1, q1, q2);
  43.     int o3 = orientation(p2, q2, p1);
  44.     int o4 = orientation(p2, q2, q1);
  45.  
  46.     if (o1 != o2 && o3 != o4) return true;
  47.     if (o1 == 0 && on_segment(p1, p2, q1)) return true;
  48.     if (o2 == 0 && on_segment(p1, q2, q1)) return true;
  49.     if (o3 == 0 && on_segment(p2, p1, q2)) return true;
  50.     if (o4 == 0 && on_segment(p2, q1, q2)) return true;
  51.  
  52.     return false;
  53. }
  54.  
  55. bool do_lines_intersection(vector<Line> lines)
  56. {
  57.     if (lines.size() < 3) return false;
  58.     for (int i = 0; i < lines.size() - 1; i++) {
  59.         if (do_intersect(lines[i].p1, lines[i].p2, lines[lines.size() - 1].p1, lines[lines.size() - 1].p2) == true) {
  60.             return true;
  61.         }
  62.     }
  63.     return false;
  64. }
  65.  
  66. int main()
  67. {
  68.     setlocale(LC_ALL, "rus");
  69.     vector<Point> points;
  70.     vector<Line> lines;
  71.  
  72.     Point point;
  73.     Line line;
  74.  
  75.     int count = 0;
  76.     bool stop = false;
  77.  
  78.     while (stop != true) {
  79.         cout << "Координата X " << count + 1 << "-й точки\n>>> "; cin >> point.x;
  80.         cout << "Координата Y " << count + 1 << "-й точки\n>>> "; cin >> point.y;
  81.  
  82.         if (count == 0) {
  83.             line.p1 = point;
  84.         }
  85.         else if (count == 1 && line.p1.x == point.x && line.p1.y == point.y) {
  86.             cout << "Неверные координаты. Вторая точка не может находится на одном месте с первой\n";
  87.             continue;
  88.         }
  89.         else if (count > 0) {
  90.             line.p2 = point;
  91.             lines.push_back(line);
  92.             if (do_lines_intersection(lines) == true) {
  93.                 lines.pop_back();
  94.                 cout << "Неверные координаты. Так линии пересекаются\n";
  95.                 continue;
  96.             }
  97.             line.p1 = point;
  98.         }
  99.         if (count > 2 && lines[0].p1.x == point.x && lines[0].p1.y == point.y) {
  100.             line.p2 = point;
  101.             lines.push_back(line);
  102.             stop = true;
  103.         }
  104.         points.push_back(point);
  105.         count++;
  106.     }
  107.  
  108.     cout << "Полученные координаты: ";
  109.     for (int i = 0; i < points.size() - 1; i++) {
  110.         cout << "[" << points[i].x << "; " << points[i].y << "] ";
  111.     }
  112.     cout << endl;
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement