Advertisement
Guest User

graph_generator

a guest
May 25th, 2018
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.57 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <random>
  4.  
  5. using namespace std;
  6.  
  7. const int R = 1;
  8. double n, L1, L2, m, k;
  9. struct point {
  10.     double x, y;
  11. };
  12. vector <point> v1;
  13. struct edge {
  14.     point org, dest;
  15. };
  16. vector <edge> v2;
  17. vector <pair <int, int>> v3;
  18.  
  19. bool belong(point p1, point p2, double a)
  20. {
  21.     double x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y;
  22.     return x2 < x1 && x1 < (x2 + a) && y2 < y1 && y1 < (y2 + a);
  23. }
  24.  
  25. bool obstacle(point p)
  26. {
  27.     double x = p.x, y = p.y;
  28.     double zn = k + L2;
  29.     point p1 = p, p2;
  30.     p2.x = 0, p2.y = 0;
  31.     return (int)(x / zn) != (int)((x + L2) / zn) && (int)(y / zn) != (int)((y + L2) / zn) && belong(p1, p2, L1);
  32. }
  33.  
  34. bool intersect(edge e1, edge e2)
  35. {
  36.     point p1 = e1.org, p2 = e1.dest, p3 = e2.org, p4 = e2.dest;
  37.     double x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y, x3 = p3.x, y3 = p3.y, x4 = p4.x, y4 = p4.y, v1, v2, v3, v4;
  38.     v1 = (x4 - x3) * (y1 - y3) - (y4 - y3) * (x1 - x3);
  39.     v2 = (x4 - x3) * (y2 - y3) - (y4 - y3) * (x2 - x3);
  40.     v3 = (x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1);
  41.     v4 = (x2 - x1) * (y4 - y1) - (y2 - y1) * (x4 - x1);
  42.     return v1 * v2 < 0 && v3 * v4 < 0;
  43. }
  44.  
  45. bool bind(point p1, point p2)
  46. {
  47.     double x1 = p1.x, y1 = p1.y, x2 = p2.x, y2 = p2.y;
  48.     for (int i = 0; i < v2.size(); ++i)
  49.     {
  50.         edge e1, e2 = v2[i];
  51.         e1.org = p1;
  52.         e1.dest = p2;
  53.         if (sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)) > R || intersect(e1, e2))
  54.             return false;
  55.     }
  56.     return true;
  57. }
  58.  
  59. int main()
  60. {
  61.     cin >> n >> L1 >> L2 >> m;
  62.     k = (L1 - m * L2) / (m + 1);
  63.     v1.resize(n);
  64.     random_device rnd;
  65.     for (int i = 0; i < n; ++i)
  66.     {
  67.         v1[i].x = (double)rnd() / rnd.max() * L1;
  68.         v1[i].y = (double)rnd() / rnd.max() * L1;
  69.         for (; obstacle(v1[i]);)
  70.         {
  71.             v1[i].x = (double)rnd() / rnd.max() * L1;
  72.             v1[i].y = (double)rnd() / rnd.max() * L1;
  73.         }
  74.     }
  75.     for (int i = 1; i <= m; ++i)
  76.         for (int j = 1; j <= m; ++j)
  77.         {
  78.             double x0, y0;
  79.             x0 = i * k + (2 * i - 1) * (double)L2 / 2;
  80.             y0 = j * k + (2 * j - 1) * (double)L2 / 2;
  81.             point a[4];
  82.             for (int k = 0; k < 4; ++k)
  83.             {
  84.                 a[k].x = x0 + ((k == 1 || k == 4) ? 1 : -1) * (double)L2 / 2;
  85.                 a[k].y = y0 + ((k == 1 || k == 2) ? 1 : -1) * (double)L2 / 2;
  86.             }
  87.             for (int k = 0; k < 4; ++k)
  88.             {
  89.                 edge e;
  90.                 e.org = a[k];
  91.                 e.dest = a[(k + 1) % 4];
  92.                 v2.push_back(e);
  93.             }
  94.         }
  95.     for (int i = 0; i < n - 1; ++i)
  96.         for (int j = i + 1; j < n; ++j)
  97.             if (bind(v1[i], v1[j]))
  98.                 v3.push_back(make_pair(i, j));
  99.     cout << v1.size() << " " << v3.size() << endl;
  100.     for (int i = 0; i < v3.size(); ++i)
  101.         cout << v3[i].first << " " << v3[i].second << endl;
  102.     system("pause");
  103.     return 0;
  104. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement