Advertisement
Guest User

Untitled

a guest
Nov 17th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.79 KB | None | 0 0
  1. #include <iostream>
  2. #include <cmath>
  3. #include <iomanip>
  4. using namespace std;
  5. const double pi = 3.14;
  6. // функция за отклонението
  7. float f(float x)
  8. {
  9.     return ((pi*x) / 2 + x) / 2;
  10. }
  11. // детерминанти,които ще определят новият х/у,когато точката е извън правоъгълника
  12. float detfornewY(float x,float y,float x1,float y1,const float const_x)
  13. {
  14.     return (x1*y + y1*const_x - x*y1 - const_x*y) / (x1 - x);
  15. }
  16. float detfornewX(float x,float y,float x1,float y1,const float const_y)
  17. {
  18.     return (x1*y + x*const_y - x*y1 - const_y*x1) / (y - y1);
  19. }
  20. //дистанцията между 2 точки
  21. float distance(float x,float y,float x1,float y1)
  22. {
  23.     return sqrt((y1 - y)*(y1 - y) + (x1 - x)*(x1 - x));
  24. }
  25. int main()
  26. {
  27.     //положително
  28.     unsigned n;
  29.     float sum = 0;
  30.     do
  31.     {
  32.         cin >> n;
  33.     } while(n > 2000000000 || n == 0);
  34.     for(int i = 0;i < n;i++)
  35.     {
  36.         float x,y,x1,y1;
  37.         // искаме да пазим предходните координати ,правим си нови променливи,за да не загубим информация за тях
  38.         float saveX = x1;
  39.         float saveY = y1;
  40.         //булеви изрази,коя точка къде се намира
  41.         bool A,B;
  42.         cin >> x1 >> y1;
  43.         //тук ще влезем само първият път
  44.         if(i == 0)
  45.         {
  46.             x = x1;
  47.             y = y1;
  48.             continue;
  49.         }
  50.         // в случай,че точката А е извън кординатната система,а Б е въре,вместо да правим допълнителни случаи ги слапваме
  51.         A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
  52.         B = (x1 >= -5 && x1 <= 5 && y1 >= -2 && y1 <= 2);
  53.         if(!A && B)
  54.         {
  55.             int p = x;
  56.             int q = y;
  57.             x = x1;
  58.             y = y1;
  59.             x1 = p;
  60.             y1 = q;
  61.         }
  62.         // може пък да сме вътре в правоъгълника с двете точки
  63.         A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
  64.         B = (x1 >= -5 && x1 <= 5 && y1 >= -2 && y1 <= 2);
  65.         if(A && B)
  66.         {
  67.             int d = distance(x,y,x1,y1);
  68.             sum += f(d);
  69.             x = x1;
  70.             y = y1;
  71.             continue;
  72.         }
  73.         // а пък може и двете да не са вътре
  74.         if(!A && !B)
  75.         {
  76.             x = saveX;;
  77.             y = saveY;
  78.             continue;
  79.         }
  80.         // имаме случай,в който х-овете влизат в очертанията на игрището,но у-ците не влизат
  81.         A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
  82.         B = (x1 >= -5 && x1 <= 5 && (y1 > 2 || y1 < - 2));
  83.         if(A && B)
  84.         {
  85.             float new_x1 = detfornewX(x,y,x1,y1,2);
  86.             y1 = 2;
  87.             float B_prim = distance(x,y,new_x1,y1);
  88.             sum += f(B_prim);
  89.             x = saveX;
  90.             y = saveY;
  91.             continue;
  92.         }
  93.         // а пък сега обратно у-ците са в очертанията,но х-овете не са
  94.         A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
  95.         B = (y1 >= -2 && y1 <= 2 && (x1 > 5 ||  x1 < -5));
  96.         if(A && B)
  97.         {
  98.             float new_y1 = detfornewY(x,y,x1,y1,5);
  99.             x1 = 5;
  100.             float B_prim = distance(x,y,x1,new_y1);
  101.             sum += f(B_prim);
  102.             x = saveX;
  103.             y = saveY;
  104.             continue;
  105.         }
  106.         // най-кофти случая
  107.         // 1) когато нашата права се пресече с правата у - 2 = 0;Тогава новата точка се заменя с у = 2 и след изчисление
  108.         // на х.Прави се проверка дали х удовлетворява условията,ако да го пращаме да търси дистанцията
  109.         // 2) когато нашата права се пресече с правата х - 5 = 0;Тогава новата точка е с координати х = 5 и след изчисление
  110.         // на у.Правим се проверка дали точката седи на контура и е в интервала [-2;2];Ако да пращаме я на дистанцията;
  111.         // 3) Нашата нова точка да се намира на ръбчето.Тогава с координати у = -2,х = 5 намираме дистанцията.
  112.         A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
  113.         B = ((x1 > 5  || x1 < -5) && (y1 < -2) || (y1 > 2));
  114.         if(A && B)
  115.         {
  116.             float new_x1 = detfornewX(x,y,x1,y1,2);
  117.             float new_y1 = detfornewY(x,y,x1,y1,5);
  118.             if(new_x1 >= -5 && new_x1 <= 5 && new_y1 >= -2 && y <= 2)
  119.             {
  120.                 x1 = 5;
  121.                 y1 = 2;
  122.                 float B_prim = distance(x,y,x1,y1);
  123.                 sum += f(B_prim);
  124.                 x = saveX;
  125.                 y = saveY;
  126.                 continue;
  127.             }
  128.             else if(new_x1 >= -5 && new_x1 <= 5)
  129.             {
  130.                 y1 = 2;
  131.                 float B_prim = distance(x,y,new_x1,y1);
  132.                 sum += f(B_prim);
  133.                 x = saveX;
  134.                 y = saveY;
  135.                 continue;
  136.             }
  137.             else
  138.             {
  139.                 x1 = 5;
  140.                 float B_prim = distance(x,y,x1,new_y1);
  141.                 sum += f(B_prim);
  142.                 x = saveX;
  143.                 y = saveY;
  144.             }
  145.         }
  146.  
  147.     // Принтим резултата
  148.     cout << setprecision(3) << sum << endl;
  149.     return 0;
  150. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement