Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <iomanip>
- using namespace std;
- const double pi = 3.14;
- // функция за отклонението
- float f(float x)
- {
- return ((pi*x) / 2 + x) / 2;
- }
- // детерминанти,които ще определят новият х/у,когато точката е извън правоъгълника
- float detfornewY(float x,float y,float x1,float y1,const float const_x)
- {
- return (x1*y + y1*const_x - x*y1 - const_x*y) / (x1 - x);
- }
- float detfornewX(float x,float y,float x1,float y1,const float const_y)
- {
- return (x1*y + x*const_y - x*y1 - const_y*x1) / (y - y1);
- }
- //дистанцията между 2 точки
- float distance(float x,float y,float x1,float y1)
- {
- return sqrt((y1 - y)*(y1 - y) + (x1 - x)*(x1 - x));
- }
- int main()
- {
- //положително
- unsigned n;
- float sum = 0;
- do
- {
- cin >> n;
- } while(n > 2000000000 || n == 0);
- for(int i = 0;i < n;i++)
- {
- float x,y,x1,y1;
- // искаме да пазим предходните координати ,правим си нови променливи,за да не загубим информация за тях
- float saveX = x1;
- float saveY = y1;
- //булеви изрази,коя точка къде се намира
- bool A,B;
- cin >> x1 >> y1;
- //тук ще влезем само първият път
- if(i == 0)
- {
- x = x1;
- y = y1;
- continue;
- }
- // в случай,че точката А е извън кординатната система,а Б е въре,вместо да правим допълнителни случаи ги слапваме
- A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
- B = (x1 >= -5 && x1 <= 5 && y1 >= -2 && y1 <= 2);
- if(!A && B)
- {
- int p = x;
- int q = y;
- x = x1;
- y = y1;
- x1 = p;
- y1 = q;
- }
- // може пък да сме вътре в правоъгълника с двете точки
- A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
- B = (x1 >= -5 && x1 <= 5 && y1 >= -2 && y1 <= 2);
- if(A && B)
- {
- int d = distance(x,y,x1,y1);
- sum += f(d);
- x = x1;
- y = y1;
- continue;
- }
- // а пък може и двете да не са вътре
- if(!A && !B)
- {
- x = saveX;;
- y = saveY;
- continue;
- }
- // имаме случай,в който х-овете влизат в очертанията на игрището,но у-ците не влизат
- A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
- B = (x1 >= -5 && x1 <= 5 && (y1 > 2 || y1 < - 2));
- if(A && B)
- {
- float new_x1 = detfornewX(x,y,x1,y1,2);
- y1 = 2;
- float B_prim = distance(x,y,new_x1,y1);
- sum += f(B_prim);
- x = saveX;
- y = saveY;
- continue;
- }
- // а пък сега обратно у-ците са в очертанията,но х-овете не са
- A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
- B = (y1 >= -2 && y1 <= 2 && (x1 > 5 || x1 < -5));
- if(A && B)
- {
- float new_y1 = detfornewY(x,y,x1,y1,5);
- x1 = 5;
- float B_prim = distance(x,y,x1,new_y1);
- sum += f(B_prim);
- x = saveX;
- y = saveY;
- continue;
- }
- // най-кофти случая
- // 1) когато нашата права се пресече с правата у - 2 = 0;Тогава новата точка се заменя с у = 2 и след изчисление
- // на х.Прави се проверка дали х удовлетворява условията,ако да го пращаме да търси дистанцията
- // 2) когато нашата права се пресече с правата х - 5 = 0;Тогава новата точка е с координати х = 5 и след изчисление
- // на у.Правим се проверка дали точката седи на контура и е в интервала [-2;2];Ако да пращаме я на дистанцията;
- // 3) Нашата нова точка да се намира на ръбчето.Тогава с координати у = -2,х = 5 намираме дистанцията.
- A = (x >= -5 && x <= 5 && y >= -2 && y <= 2);
- B = ((x1 > 5 || x1 < -5) && (y1 < -2) || (y1 > 2));
- if(A && B)
- {
- float new_x1 = detfornewX(x,y,x1,y1,2);
- float new_y1 = detfornewY(x,y,x1,y1,5);
- if(new_x1 >= -5 && new_x1 <= 5 && new_y1 >= -2 && y <= 2)
- {
- x1 = 5;
- y1 = 2;
- float B_prim = distance(x,y,x1,y1);
- sum += f(B_prim);
- x = saveX;
- y = saveY;
- continue;
- }
- else if(new_x1 >= -5 && new_x1 <= 5)
- {
- y1 = 2;
- float B_prim = distance(x,y,new_x1,y1);
- sum += f(B_prim);
- x = saveX;
- y = saveY;
- continue;
- }
- else
- {
- x1 = 5;
- float B_prim = distance(x,y,x1,new_y1);
- sum += f(B_prim);
- x = saveX;
- y = saveY;
- }
- }
- // Принтим резултата
- cout << setprecision(3) << sum << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement