Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define int long long
- using namespace std;
- double len(double x1,double y1,double x2,double y2){
- return sqrt(((x1-x2)*(x1-x2))+((y1-y2)*(y1-y2)));
- }
- const double EPS = 1e-8;
- signed main(){
- int x1,y1,x2,y2,x0,y0,r;
- cin>>x1>>y1>>x2>>y2>>x0>>y0>>r;
- int a=y1-y2;
- int b=x2-x1;
- int c=x1*y2-x2*y1;
- int cnew=a*x0+b*y0+c;
- double rast=1.0*abs(cnew)/sqrt(a*a+b*b);
- if ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)==r*r && (x2-x0)*(x2-x0)+(y2-y0)*(y2-y0)==r*r){
- double coss=1.0*(1-pow(len(x1,y1,x2,y2),2)/2/r/r);
- double alphh=acos(coss);
- cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<alphh*r;
- }else if ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)==r*r && (x2-x0)*(x2-x0)+(y2-y0)*(y2-y0)!=r*r){
- double rast1=1.0*sqrt(r*r-rast*rast);
- double x11=1.0*a*cnew/(a*a+b*b);
- double y11=1.0*b*cnew/(a*a+b*b);
- if (a*x11+b*y11+cnew!=0){
- x11=-x11;
- y11=-y11;
- }
- double x22=1.0*-b*rast1/sqrt(a*a+b*b);
- double y22=1.0*a*rast1/sqrt(a*a+b*b);
- double xx1=x11+x22+x0;
- double yy1=y11+y22+y0;
- double xx2=x11-x22+x0;
- double yy2=y11-y22+y0;
- 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)){
- cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<len(x1,y1,x2,y2);
- }else{
- //касательная
- double xv2=(x0-x2)/len(x2,y2,x0,y0);
- double yv2=(y0-y2)/len(x2,y2,x0,y0);
- double sin2=1.0*r/len(x2,y2,x0,y0);
- double cos2=sqrt(1-sin2*sin2);
- double xv=(xv2*cos2-yv2*sin2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
- double yv=(xv2*sin2+yv2*cos2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
- double x_v=(xv2*cos2+yv2*sin2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
- double y_v=(-xv2*sin2+yv2*cos2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
- double xk2=x2+xv;
- double yk2=y2+yv;
- double x_k2=x2+x_v;
- double y_k2=y2+y_v;
- double xk1=x1;
- double yk1=y1;
- double len_1=0;
- len_1+=len(xk2,yk2,x2,y2);
- double cos=1.0*(1-pow(len(xk1,yk1,xk2,yk2),2)/2/r/r);
- double alph=acos(cos);
- len_1+=alph*r;
- double len_2=0;
- len_2+=len(x_k2,y_k2,x2,y2);
- cos=1.0*(1-pow(len(xk1,yk1,x_k2,y_k2),2)/2/r/r);
- alph=acos(cos);
- len_2+=alph*r;
- cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<min(len_1,len_2);
- }
- }else if ((x1-x0)*(x1-x0)+(y1-y0)*(y1-y0)!=r*r && (x2-x0)*(x2-x0)+(y2-y0)*(y2-y0)==r*r){
- double rast1=1.0*sqrt(r*r-rast*rast);
- double x11=1.0*a*cnew/(a*a+b*b);
- double y11=1.0*b*cnew/(a*a+b*b);
- if (a*x11+b*y11+cnew!=0){
- x11=-x11;
- y11=-y11;
- }
- double x22=1.0*-b*rast1/sqrt(a*a+b*b);
- double y22=1.0*a*rast1/sqrt(a*a+b*b);
- double xx1=x11+x22+x0;
- double yy1=y11+y22+y0;
- double xx2=x11-x22+x0;
- double yy2=y11-y22+y0;
- 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)){
- cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<len(x1,y1,x2,y2);
- }else{
- //касательная
- double xv1=(x0-x1)/len(x1,y1,x0,y0);
- double yv1=(y0-y1)/len(x1,y1,x0,y0);
- double sin1=1.0*r/len(x1,y1,x0,y0);
- double cos1=sqrt(1-sin1*sin1);
- double xv=(xv1*cos1-yv1*sin1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
- double yv=(xv1*sin1+yv1*cos1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
- double x_v=(xv1*cos1+yv1*sin1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
- double y_v=(-xv1*sin1+yv1*cos1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
- double xk1=x1+xv;
- double yk1=y1+yv;
- double x_k1=x1+x_v;
- double y_k1=y1+y_v;
- double xk2=x2;
- double yk2=y2;
- double len_1=0;
- len_1+=len(xk1,yk1,x1,y1);
- double cos=1.0*(1-pow(len(xk1,yk1,xk2,yk2),2)/2/r/r);
- double alph=acos(cos);
- len_1+=alph*r;
- double len_2=0;
- len_2+=len(x_k1,y_k1,x1,y1);
- cos=1.0*(1-pow(len(xk2,yk2,x_k1,y_k1),2)/2/r/r);
- alph=acos(cos);
- len_2+=alph*r;
- cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<min(len_1,len_2);
- }
- }else if (rast>=r){
- double l=1.0*sqrt(b*b+a*a);
- cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<l;
- }else{
- double rast1=1.0*sqrt(r*r-rast*rast);
- double x11=1.0*a*cnew/(a*a+b*b);
- double y11=1.0*b*cnew/(a*a+b*b);
- if (a*x11+b*y11+cnew!=0){
- x11=-x11;
- y11=-y11;
- }
- double x22=1.0*-b*rast1/sqrt(a*a+b*b);
- double y22=1.0*a*rast1/sqrt(a*a+b*b);
- double xx1=x11+x22+x0;
- double yy1=y11+y22+y0;
- double xx2=x11-x22+x0;
- double yy2=y11-y22+y0;
- 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){
- cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<len(x1,y1,x2,y2);
- }else{
- //первая касательная
- double xv1=(x0-x1)/len(x1,y1,x0,y0);
- double yv1=(y0-y1)/len(x1,y1,x0,y0);
- double sin1=1.0*r/len(x1,y1,x0,y0);
- double cos1=sqrt(1-sin1*sin1);
- double xv=(xv1*cos1-yv1*sin1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
- double yv=(xv1*sin1+yv1*cos1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
- double x_v=(xv1*cos1+yv1*sin1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
- double y_v=(-xv1*sin1+yv1*cos1)*sqrt(pow(len(x1,y1,x0,y0),2)-r*r);
- double xk1=x1+xv;
- double yk1=y1+yv;
- double x_k1=x1+x_v;
- double y_k1=y1+y_v;
- //вторая касательная
- double xv2=(x0-x2)/len(x2,y2,x0,y0);
- double yv2=(y0-y2)/len(x2,y2,x0,y0);
- double sin2=1.0*r/len(x2,y2,x0,y0);
- double cos2=sqrt(1-sin2*sin2);
- xv=(xv2*cos2-yv2*sin2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
- yv=(xv2*sin2+yv2*cos2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
- x_v=(xv2*cos2+yv2*sin2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
- y_v=(-xv2*sin2+yv2*cos2)*sqrt(pow(len(x2,y2,x0,y0),2)-r*r);
- double xk2=x2+xv;
- double yk2=y2+yv;
- double x_k2=x2+x_v;
- double y_k2=y2+y_v;
- //подсчет длины
- double len5=0;
- if (len(xx1,yy1,x1,y1)<len(xx2,yy2,x1,y1)){
- len5+=len(xx1,yy1,x1,y1);
- len5+=len(xx2,yy2,x2,y2);
- double cos=1.0*(1-pow(len(xx1,yy1,xx2,yy2),2)/2/r/r);
- double alph=acos(cos);
- len5+=alph*r;
- }else{
- len5+=len(xx1,yy1,x2,y2);
- len5+=len(xx2,yy2,x1,y1);
- double cos=(1-len(xx1,yy1,xx2,yy2)*len(xx1,yy1,xx2,yy2)/2/r/r);
- double alph=acos(cos);
- len5+=alph*r;
- }
- double len1=0;//k1,k2
- len1+=len(xk1,yk1,x1,y1);
- len1+=len(xk2,yk2,x2,y2);
- double cos=1.0*(1-pow(len(xk1,yk1,xk2,yk2),2)/2/r/r);
- double alph=acos(cos);
- len1+=alph*r;
- double len2=0;//_k1,k2
- len2+=len(x_k1,y_k1,x1,y1);
- len2+=len(xk2,yk2,x2,y2);
- cos=1.0*(1-len(x_k1,y_k1,xk2,yk2)*len(x_k1,y_k1,xk2,yk2)/2/r/r);
- alph=acos(cos);
- len2+=alph*r;
- double len3=0;//k1,_k2
- len3+=len(xk1,yk1,x1,y1);
- len3+=len(x_k2,y_k2,x2,y2);
- cos=1.0*(1-pow(len(xk1,yk1,x_k2,y_k2),2)/2/r/r);
- alph=acos(cos);
- len3+=alph*r;
- double len4=0;//_k1,_k2
- len4+=len(x_k1,y_k1,x1,y1);
- len4+=len(x_k2,y_k2,x2,y2);
- cos=1.0*(1-pow(len(x_k1,y_k1,x_k2,y_k2),2)/2/r/r);
- alph=acos(cos);
- len4+=alph*r;
- cout<< setprecision(10) << setiosflags(ios::fixed | ios::showpoint)<<min(len1,min(len2,min(len3,min(len4,len5))));
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement