Um_nik

Pahom

Jan 5th, 2014
281
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.31 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. double eps = 1e-8;
  6. double ans;
  7. double INF = 1e11;
  8.  
  9. struct Point
  10. {
  11.     double x, y;
  12.  
  13.     Point () {}
  14.     Point (double a, double b) : x(a), y(b) {}
  15.  
  16.     void Scan()
  17.     {
  18.         scanf("%lf%lf", &x, &y);
  19.     }
  20.  
  21.     void Print()
  22.     {
  23.         printf("%.3lf %.3lf\n", x, y);
  24.     }
  25.  
  26.     Point operator + (Point a)
  27.     {
  28.         return Point(x + a.x, y + a.y);
  29.     }
  30.  
  31.     Point operator - (Point a)
  32.     {
  33.         return Point(x - a.x, y - a.y);
  34.     }
  35.  
  36.     double operator % (Point a)
  37.     {
  38.         return x * a.x + y * a.y;
  39.     }
  40.  
  41.     double operator * (Point a)
  42.     {
  43.         return x * a.y - y * a.x;
  44.     }
  45.  
  46.     Point operator * (double a)
  47.     {
  48.         return Point(x * a, y * a);
  49.     }
  50.  
  51.     double len()
  52.     {
  53.         return sqrt(x * x + y * y);
  54.     }
  55. };
  56. Point A, B, C, S, T;
  57. Point O;
  58.  
  59. bool intersect(Point P, Point a, Point Q, Point b)
  60. {
  61.     if (fabs(a * b) < eps)
  62.         return false;
  63.     double m = ((P - Q) * a) / (b * a);
  64.     O = Q + b * m;
  65.     return true;
  66. }
  67.  
  68. bool isOnSegment(Point Q, Point W, Point Z)
  69. {
  70.     if (((Q - W) % (Z - W) > eps) && ((Q - Z) % (W - Z) > eps))
  71.         return true;
  72.     return false;
  73. }
  74.  
  75. bool inter(Point Y, Point U, Point I, Point P)
  76. {
  77.     if (!intersect(Y, U - Y, I, P - I))
  78.         return false;
  79.     if (isOnSegment(O, Y, U) && isOnSegment(O, I, P))
  80.         return true;
  81.     return false;
  82. }
  83.  
  84. int main()
  85. {
  86. //  freopen("input.txt", "r", stdin);
  87. //  freopen("output.txt", "w", stdout);
  88.  
  89.     int w;
  90.     scanf("%d", &w);
  91.     for (int i = 0; i < w; i++)
  92.     {
  93.         S.Scan();
  94.         T.Scan();
  95.         A.Scan();
  96.         B.Scan();
  97.         C.Scan();
  98.         ans = INF;
  99.         //напрямую
  100.         if (!inter(S, T, A, B) && !inter(S, T, B, C))
  101.             if (ans > (S - T).len())
  102.                 ans = (S - T).len();
  103.         //через одну из граничных
  104.         if (!inter(S, A, B, C) && !inter(A, T, B, C))
  105.             if (ans > (S - A).len() + (A - T).len())
  106.                 ans = (S - A).len() + (A - T).len();
  107.         if (!inter(S, C, B, A) && !inter(C, T, B, A))
  108.             if (ans > (S - C).len() + (C - T).len())
  109.                 ans = (S - C).len() + (C - T).len();
  110.         //через центр и одну из граничных
  111.         if (ans > (S - B).len() + (B - A).len() + (A - T).len())
  112.             ans = (S - B).len() + (B - A).len() + (A - T).len();
  113.         if (ans > (S - B).len() + (B - C).len() + (C - T).len())
  114.             ans = (S - B).len() + (B - C).len() + (C - T).len();
  115.         if (ans > (T - B).len() + (B - A).len() + (A - S).len())
  116.             ans = (T - B).len() + (B - A).len() + (A - S).len();
  117.         if (ans > (T - B).len() + (B - C).len() + (C - S).len())
  118.             ans = (T - B).len() + (B - C).len() + (C - S).len();
  119.         //через две граничных
  120.         if (!inter(S, C, B, A) && !inter(A, T, B, C))
  121.             if (ans > (S - C).len() + (C - A).len() + (A - T).len())
  122.                 ans = (S - C).len() + (C - A).len() + (A - T).len();
  123.         if (!inter(S, A, B, C) && !inter(C, T, B, C))
  124.             if (ans > (S - A).len() + (A - C).len() + (C - T).len())
  125.                 ans = (S - A).len() + (A - C).len() + (C - T).len();
  126.        
  127.         double PI = 4. * atan(1.);
  128.  
  129.         double alpha = atan2((A - B) * (S - B), (A - B) % (S - B)), beta = atan2((A - B) * (T - B), (A - B) % (T - B)), gamma = atan2((A - B) * (C - B), (A - B) % (C - B));
  130.         if (alpha < 0)
  131.             alpha += 2 * PI;
  132.         if (beta < 0)
  133.             beta += 2 * PI;
  134.         if (gamma < 0)
  135.             gamma += 2 * PI;
  136.         //через центр
  137.         if ((alpha - gamma) * (beta - gamma) > 0)
  138.             if (ans > (S - B).len() + (B - T).len())
  139.                 ans = (S - B).len() + (B - T).len();
  140.        
  141.         printf("%.8lf\n", ans);
  142.     }
  143.     return 0;
  144. }
Advertisement
Add Comment
Please, Sign In to add comment