#include #include #include #include using namespace std; #define EPS 1.0E-9 #define deq( a, b ) ( fabs((a) - (b)) < EPS ) #define dle( a, b ) ( (a) < (b) || deq(a, b) ) #define M_PI (2*acos(0.0)) class Point3D { public: double x, y, z; void rotateonZ( double rad ) { double tx = x, ty = y; x = tx*cos(rad) - ty*sin(rad); y = tx*sin(rad) + ty*cos(rad); } void rotateonY( double rad ) { double tz = z, tx = x; z = tz*cos(rad) - tx*sin(rad); x = tz*sin(rad) + tx*cos(rad); } void rotateonX( double rad ) { double ty = y, tz = z; y = ty*cos(rad) - tz*sin(rad); z = ty*sin(rad) + tz*cos(rad); } }; double dist( double x, double y ) { return sqrt(x*x + y*y); } double dist( double x1, double y1, double x2, double y2 ) { return sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); } double compute( double R, double x1, double y1, double x2, double y2 ) { const double d1 = dist(x1, y1); const double d2 = dist(x2, y2); const double tan1 = sqrt(d1*d1 - R*R); const double tan2 = sqrt(d2*d2 - R*R); const double theta1 = acos(R/d1); const double theta2 = acos(R/d2); double tx = R*cos(theta1); double ty = R*sin(theta1); if ( dle(tx, x2) || dle(-ty*(x2-x1)/(x1-tx), y2) ) return dist(x1, y1, x2, y2); else return tan1 + tan2 + R*(acos(x2/d2) - (theta1 + theta2)); } int main() { Point3D A, B, C; double R; cin >> A.x >> A.y >> A.z; cin >> B.x >> B.y >> B.z; cin >> C.x >> C.y >> C.z; cin >> R; A.x -= C.x, A.y -= C.y, A.z -= C.z; B.x -= C.x, B.y -= C.y, B.z -= C.z; C.x = 0.0, C.y = 0.0, C.z = 0.0; const double theta1 = -atan2(A.y, A.x); A.rotateonZ(theta1); B.rotateonZ(theta1); const double theta2 = -atan2(A.x, A.z); A.rotateonY(theta2 + M_PI/2); B.rotateonY(theta2 + M_PI/2); const double theta3 = -atan2(B.z, B.y); B.rotateonX(theta3); assert( deq(A.y, 0.0) && deq(A.z, 0.0) && deq(B.z, 0.0) ); printf("%.2lf\n", compute(R, A.x, 0.0, B.x, B.y)); return 0; }