Advertisement
Guest User

Untitled

a guest
Aug 19th, 2019
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.36 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define int long long
  3. using namespace std;
  4.  
  5. double len(double x1,double y1,double x2,double y2){
  6. return sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));
  7. }
  8.  
  9. const double EPS = 1e-8;
  10.  
  11. signed main(){
  12. int x1,y1,x2,y2,x0,y0,r;
  13. cin>>x1>>y1>>x2>>y2>>x0>>y0>>r;
  14. int a=y1-y2;
  15. int b=x2-x1;
  16. int c=x1*y2-x2*y1;
  17. int cnew=a*x0+b*y0+c;
  18. double rast=1.0*abs(cnew)/sqrt(a*a+b*b);
  19. if ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)==r*r && (x2-x0)*(x2-x0)+(y2-y0)*(y2-y0)==r*r){
  20. double coss=1.0*(1-pow(len(x1,y1,x2,y2),2)/2/r/r);
  21. double alphh=acos(coss);
  22. cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<alphh*r;
  23. }else if ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)==r*r && (x2-x0)*(x2-x0)+(y2-y0)*(y2-y0)!=r*r){
  24. double rast1=1.0*sqrt(r*r-rast*rast);
  25. double x11=1.0*a*cnew/(a*a+b*b);
  26. double y11=1.0*b*cnew/(a*a+b*b);
  27. if (a*x11+b*y11+cnew!=0){
  28. x11=-x11;
  29. y11=-y11;
  30. }
  31. double x22=1.0*-b*rast1/sqrt(a*a+b*b);
  32. double y22=1.0*a*rast1/sqrt(a*a+b*b);
  33. double xx1=x11+x22+x0;
  34. double yy1=y11+y22+y0;
  35. double xx2=x11-x22+x0;
  36. double yy2=y11-y22+y0;
  37. if ((len(xx1,yy1,x1,y1)+len(xx1,yy1,x2,y2))>len(x1,y1,x2,y2) || (len(xx2,yy2,x1,y1)+len(xx2,yy2,x2,y2))>len(x1,y1,x2,y2)){
  38. cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<len(x1,y1,x2,y2);
  39.  
  40. }else{
  41. //касательная
  42.  
  43. double xv2=(x0-x2)/len(x2,y2,x0,y0);
  44. double yv2=(y0-y2)/len(x2,y2,x0,y0);
  45. double sin2=1.0*r/len(x2,y2,x0,y0);
  46. double cos2=sqrt(1-sin2*sin2);
  47.  
  48. double xv=(xv2*cos2-yv2*sin2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
  49. double yv=(xv2*sin2+yv2*cos2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
  50.  
  51. double x_v=(xv2*cos2+yv2*sin2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
  52. double y_v=(-xv2*sin2+yv2*cos2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
  53.  
  54. double xk2=x2+xv;
  55. double yk2=y2+yv;
  56.  
  57. double x_k2=x2+x_v;
  58. double y_k2=y2+y_v;
  59.  
  60. double xk1=x1;
  61. double yk1=y1;
  62.  
  63. double len_1=0;
  64. len_1+=len(xk2,yk2,x2,y2);
  65. double cos=1.0*(1-pow(len(xk1,yk1,xk2,yk2),2)/2/r/r);
  66. double alph=acos(cos);
  67. len_1+=alph*r;
  68.  
  69. double len_2=0;
  70. len_2+=len(x_k2,y_k2,x2,y2);
  71. cos=1.0*(1-pow(len(xk1,yk1,x_k2,y_k2),2)/2/r/r);
  72. alph=acos(cos);
  73. len_2+=alph*r;
  74.  
  75. cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<min(len_1,len_2);
  76. }
  77. }else if ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)!=r*r && (x2-x0)*(x2-x0)+(y2-y0)*(y2-y0)==r*r){
  78. double rast1=1.0*sqrt(r*r-rast*rast);
  79. double x11=1.0*a*cnew/(a*a+b*b);
  80. double y11=1.0*b*cnew/(a*a+b*b);
  81. if (a*x11+b*y11+cnew!=0){
  82. x11=-x11;
  83. y11=-y11;
  84. }
  85. double x22=1.0*-b*rast1/sqrt(a*a+b*b);
  86. double y22=1.0*a*rast1/sqrt(a*a+b*b);
  87. double xx1=x11+x22+x0;
  88. double yy1=y11+y22+y0;
  89. double xx2=x11-x22+x0;
  90. double yy2=y11-y22+y0;
  91. if ((len(xx1,yy1,x1,y1)+len(xx1,yy1,x2,y2))>len(x1,y1,x2,y2) || (len(xx2,yy2,x1,y1)+len(xx2,yy2,x2,y2))>len(x1,y1,x2,y2)){
  92. cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<len(x1,y1,x2,y2);
  93.  
  94. }else{
  95. //касательная
  96.  
  97. double xv1=(x0-x1)/len(x1,y1,x0,y0);
  98. double yv1=(y0-y1)/len(x1,y1,x0,y0);
  99. double sin1=1.0*r/len(x1,y1,x0,y0);
  100. double cos1=sqrt(1-sin1*sin1);
  101.  
  102. double xv=(xv1*cos1-yv1*sin1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
  103. double yv=(xv1*sin1+yv1*cos1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
  104.  
  105. double x_v=(xv1*cos1+yv1*sin1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
  106. double y_v=(-xv1*sin1+yv1*cos1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
  107.  
  108. double xk1=x1+xv;
  109. double yk1=y1+yv;
  110.  
  111. double x_k1=x1+x_v;
  112. double y_k1=y1+y_v;
  113.  
  114. double xk2=x2;
  115. double yk2=y2;
  116.  
  117. double len_1=0;
  118. len_1+=len(xk1,yk1,x1,y1);
  119. double cos=1.0*(1-pow(len(xk1,yk1,xk2,yk2),2)/2/r/r);
  120. double alph=acos(cos);
  121. len_1+=alph*r;
  122.  
  123. double len_2=0;
  124. len_2+=len(x_k1,y_k1,x1,y1);
  125. cos=1.0*(1-pow(len(xk2,yk2,x_k1,y_k1),2)/2/r/r);
  126. alph=acos(cos);
  127. len_2+=alph*r;
  128.  
  129. cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<min(len_1,len_2);
  130. }
  131. }else if (rast>=r){
  132. double l=1.0*sqrt(b*b+a*a);
  133. cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<l;
  134. }else{
  135. double rast1=1.0*sqrt(r*r-rast*rast);
  136. double x11=1.0*a*cnew/(a*a+b*b);
  137. double y11=1.0*b*cnew/(a*a+b*b);
  138. if (a*x11+b*y11+cnew!=0){
  139. x11=-x11;
  140. y11=-y11;
  141. }
  142. double x22=1.0*-b*rast1/sqrt(a*a+b*b);
  143. double y22=1.0*a*rast1/sqrt(a*a+b*b);
  144. double xx1=x11+x22+x0;
  145. double yy1=y11+y22+y0;
  146. double xx2=x11-x22+x0;
  147. double yy2=y11-y22+y0;
  148. if ((len(xx1,yy1,x1,y1)+len(xx1,yy1,x2,y2))>len(x1,y1,x2,y2)+EPS || (len(xx2,yy2,x1,y1)+len(xx2,yy2,x2,y2))>len(x1,y1,x2,y2)+EPS){
  149. cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<len(x1,y1,x2,y2);
  150.  
  151. }else{
  152. //первая касательная
  153. double xv1=(x0-x1)/len(x1,y1,x0,y0);
  154. double yv1=(y0-y1)/len(x1,y1,x0,y0);
  155. double sin1=1.0*r/len(x1,y1,x0,y0);
  156. double cos1=sqrt(1-sin1*sin1);
  157.  
  158. double xv=(xv1*cos1-yv1*sin1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
  159. double yv=(xv1*sin1+yv1*cos1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
  160.  
  161. double x_v=(xv1*cos1+yv1*sin1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
  162. double y_v=(-xv1*sin1+yv1*cos1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
  163.  
  164. double xk1=x1+xv;
  165. double yk1=y1+yv;
  166.  
  167. double x_k1=x1+x_v;
  168. double y_k1=y1+y_v;
  169.  
  170. //вторая касательная
  171.  
  172. double xv2=(x0-x2)/len(x2,y2,x0,y0);
  173. double yv2=(y0-y2)/len(x2,y2,x0,y0);
  174. double sin2=1.0*r/len(x2,y2,x0,y0);
  175. double cos2=sqrt(1-sin2*sin2);
  176.  
  177. xv=(xv2*cos2-yv2*sin2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
  178. yv=(xv2*sin2+yv2*cos2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
  179.  
  180. x_v=(xv2*cos2+yv2*sin2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
  181. y_v=(-xv2*sin2+yv2*cos2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
  182.  
  183. double xk2=x2+xv;
  184. double yk2=y2+yv;
  185.  
  186. double x_k2=x2+x_v;
  187. double y_k2=y2+y_v;
  188.  
  189. //подсчет длины
  190. double len5=0;
  191. if (len(xx1,yy1,x1,y1)<len(xx2,yy2,x1,y1)){
  192. len5+=len(xx1,yy1,x1,y1);
  193. len5+=len(xx2,yy2,x2,y2);
  194. double cos=1.0*(1-pow(len(xx1,yy1,xx2,yy2),2)/2/r/r);
  195. double alph=acos(cos);
  196. len5+=alph*r;
  197. }else{
  198. len5+=len(xx1,yy1,x2,y2);
  199. len5+=len(xx2,yy2,x1,y1);
  200. double cos=(1-len(xx1,yy1,xx2,yy2)*len(xx1,yy1,xx2,yy2)/2/r/r);
  201. double alph=acos(cos);
  202. len5+=alph*r;
  203. }
  204. double len1=0;//k1,k2
  205. len1+=len(xk1,yk1,x1,y1);
  206. len1+=len(xk2,yk2,x2,y2);
  207. double cos=1.0*(1-pow(len(xk1,yk1,xk2,yk2),2)/2/r/r);
  208. double alph=acos(cos);
  209. len1+=alph*r;
  210.  
  211.  
  212. double len2=0;//_k1,k2
  213. len2+=len(x_k1,y_k1,x1,y1);
  214. len2+=len(xk2,yk2,x2,y2);
  215. cos=1.0*(1-len(x_k1,y_k1,xk2,yk2)*len(x_k1,y_k1,xk2,yk2)/2/r/r);
  216. alph=acos(cos);
  217. len2+=alph*r;
  218.  
  219. double len3=0;//k1,_k2
  220. len3+=len(xk1,yk1,x1,y1);
  221. len3+=len(x_k2,y_k2,x2,y2);
  222. cos=1.0*(1-pow(len(xk1,yk1,x_k2,y_k2),2)/2/r/r);
  223. alph=acos(cos);
  224. len3+=alph*r;
  225.  
  226. double len4=0;//_k1,_k2
  227. len4+=len(x_k1,y_k1,x1,y1);
  228. len4+=len(x_k2,y_k2,x2,y2);
  229. cos=1.0*(1-pow(len(x_k1,y_k1,x_k2,y_k2),2)/2/r/r);
  230. alph=acos(cos);
  231. len4+=alph*r;
  232.  
  233. cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<min(len1,min(len2,min(len3,min(len4,len5))));
  234. }
  235. }
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement