Advertisement
NHumme

Untitled

Mar 2nd, 2019
254
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.14 KB | None | 0 0
  1. const double PI = 3.14159265358979323846;
  2. const double EPS = 1e-8;
  3.  
  4. struct point
  5. {
  6.     double x, y;
  7.  
  8.     point() : x(0), y(0) {}
  9.     point(double _x, double _y) : x(_x), y(_y) {}
  10.  
  11.     double dist(point b)
  12.     {
  13.         return sqrt((x - b.x) * (x - b.x) + (y - b.y) * (y - b.y));
  14.     }
  15.  
  16.     bool operator==(point b)
  17.     {
  18.         return fabs(x - b.x) <= EPS && fabs(y - b.y) <= EPS;
  19.     }
  20.  
  21.     bool operator<(point b) const
  22.     {
  23.         if (x < b.x - EPS)
  24.             return true;
  25.         if (fabs(x - b.x) <= EPS && y < b.y - EPS)
  26.             return true;
  27.         return false;
  28.     }
  29. };
  30.  
  31.  
  32. struct line
  33. {
  34.     double a, b, c;
  35.  
  36.     line() : a(0), b(0), c(0) {}
  37.     line(double _a, double _b, double _c) : a(_a), b(_b), c(_c) {}
  38.     line(point p1, point p2) : a(p1.y - p2.y), b(p2.x - p1.x), c(p1.x * p2.y - p2.x * p1.y) {}
  39.  
  40.     bool parallel(line x)
  41.     {
  42.         return a * x.b - b * x.a == 0;
  43.     }
  44.  
  45.     point cross(line x)
  46.     {
  47.         point ans;
  48.         ans.x = -((c * x.b - x.c * b) / (a * x.b - x.a * b));
  49.         ans.y = -((a * x.c - x.a * c) / (a * x.b - x.a * b));
  50.         return ans;
  51.     }
  52.  
  53.     double dist_to_point(point p)
  54.     {
  55.         double res = a * p.x + b * p.y + c;
  56.         res /= sqrt(a * a + b * b);
  57.         return res;
  58.     }
  59. };
  60.  
  61.  
  62. struct vt
  63. {
  64.     double x, y;
  65.  
  66.     vt() : x(0), y(0) {}
  67.     vt(double _x, double _y) : x(_x), y(_y) {}
  68.     vt(point a, point b) : x(b.x - a.x), y(b.y - a.y) {}
  69.  
  70.     void norm()
  71.     {
  72.         double length = len();
  73.         x /= length;
  74.         y /= length;
  75.     }
  76.  
  77.     bool operator==(vt& v)
  78.     {
  79.         vt copy_a(x, y), copy_b = v;
  80.         copy_a.norm();
  81.         copy_b.norm();
  82.         return point(copy_a.x, copy_a.y) == point(copy_b.x, copy_b.y);
  83.     }
  84.  
  85.     vt operator+(vt& v)
  86.     {
  87.         return vt(x + v.x, y + v.y);
  88.     }
  89.  
  90.     vt operator-(vt& v)
  91.     {
  92.         return vt(x - v.x, y - v.y);
  93.     }
  94.  
  95.     double operator*(vt& v)
  96.     {
  97.         return x * v.x + y * v.y;
  98.     }
  99.  
  100.     vt operator*(double k)
  101.     {
  102.         return vt(k * x, k * y);
  103.     }
  104.  
  105.     double operator^(vt& v)
  106.     {
  107.         return x * v.y - v.x * y;
  108.     }
  109.  
  110.     vt operator-()
  111.     {
  112.         return vt(-x, -y);
  113.     }
  114.  
  115.     double angle(vt& v)
  116.     {
  117.         return atan2((vt(x, y) ^ v), (vt(x, y) * v));
  118.     }
  119.  
  120.     double len()
  121.     {
  122.         return sqrt((double)(x * x + y * y));
  123.     }
  124. };
  125.  
  126.  
  127. struct segm
  128. {
  129.     point p1, p2;
  130.  
  131.     segm() : p1(0, 0), p2(0, 0){}
  132.     segm(double _x1, double _y1, double _x2, double _y2) : p1(_x1, _y1), p2(_x2, _y2){}
  133.     segm(point a, point b) : p1(a), p2(b){}
  134.  
  135.     double len()
  136.     {
  137.         return sqrt((p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y));
  138.     }
  139.  
  140.     bool operator==(segm& s)
  141.     {
  142.         return s.p1 == p1 && s.p2 == p2;
  143.     }
  144.  
  145.     double dist(point p)
  146.     {
  147.         vt a1(p1, p), b1(p1, p2);
  148.         vt a2(p2, p), b2(p2, p1);
  149.         if (a1 * b1 >= 0 && a2 * b2 >= 0)
  150.         {
  151.             return fabs((a1 ^ b2) / len());
  152.         }
  153.         else
  154.         {
  155.             return min(p.dist(p1), p.dist(p2));
  156.         }
  157.     }
  158.  
  159.     line to_line()
  160.     {
  161.         return line(p1, p2);
  162.     }
  163.  
  164.     bool is_bounding_box_cross(segm s)
  165.     {
  166.         point a = p1, b = p2, c = s.p1, d = s.p2;
  167.  
  168.         //x
  169.         int ax = a.x, bx = b.x, cx = c.x, dx = d.x;
  170.         if (ax > bx)
  171.             swap(ax, bx);
  172.         if (cx > dx)
  173.             swap(cx, dx);
  174.         if (max(ax, cx) > min(bx, dx))
  175.             return false;
  176.  
  177.         //y
  178.         int ay = a.y, by = b.y, cy = c.y, dy = d.y;
  179.         if (ay > by)
  180.             swap(ay, by);
  181.         if (cy > dy)
  182.             swap(cy, dy);
  183.         if (max(ay, cy) > min(by, dy))
  184.             return false;
  185.  
  186.         if (b < a)
  187.             swap(a, b);
  188.         if (d < c)
  189.             swap(c, d);
  190.  
  191.         return true;
  192.     }
  193.  
  194.     bool cross(segm b, segm& res)
  195.     {
  196.         segm pre_res;
  197.  
  198.         vt p1_p3 = vt(p1, b.p1),
  199.             p1_p2 = vt(p1, p2),
  200.             p1_p4 = vt(p1, b.p2),
  201.             p3_p1 = vt(b.p1, p1),
  202.             p3_p4 = vt(b.p1, b.p2),
  203.             p3_p2 = vt(b.p1, p2);
  204.         bool ok = ((p1_p3 ^ p1_p2) * (p1_p4 ^ p1_p2) <= 0 &&
  205.             (p3_p1 ^ p3_p4) * (p3_p2 ^ p3_p4) <= 0 && is_bounding_box_cross(b));
  206.  
  207.         if (!ok)
  208.             return false;
  209.  
  210.         line x1(p1, p2);
  211.         line x2(b.p1, b.p2);
  212.  
  213.         if (x1.parallel(x2))
  214.         {
  215.             point left, right;
  216.            
  217.             point A = p1, B = p2, C = b.p1, D = b.p2;
  218.  
  219.             if (D < C)
  220.                 swap(C, D);
  221.             if (B < A)
  222.                 swap(A, B);
  223.  
  224.             left = max(A, C);
  225.             right = min(B, D);
  226.  
  227.             res = segm(left, right);
  228.         }
  229.         else
  230.         {
  231.             point x = x1.cross(x2);
  232.             res = segm(x, x);
  233.         }
  234.         return true;
  235.     }
  236. };
  237.  
  238.  
  239. double cosine_by_sine(double sine)
  240. {
  241.     return sqrt(1 - sine * sine);
  242. }
  243.  
  244. double sine_by_cosine(double cosine)
  245. {
  246.     return sqrt(1 - cosine * cosine);
  247. }
  248.  
  249. double rad_to_deg(double ang)
  250. {
  251.     return (180. * ang) / PI;
  252. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement