#include #include #include using namespace std; struct point { double x, y, z; }; point sub( point a, point b ) { point ret; ret.x = a.x - b.x; ret.y = a.y - b.y; ret.z = a.z - b.z; return ret; } double dot_product( point a, point b ) { return a.x * b.x + a.y * b.y + a.z * b.z; } double len( point a, point b ) { return sqrt( dot_product( sub( a, b ), sub( a, b ) ) ); } int main( void ) { point a, b, c; double R; cin >> a.x >> a.y >> a.z >> b.x >> b.y >> b.z >> c.x >> c.y >> c.z >> R; double direct_length = len( a, b ); if ( direct_length == 0.00 ) { printf( "0.00\n" ); return 0; } double k = dot_product( sub( a, b ), sub( c, b ) ) / dot_product( sub( a, b ), sub( a, b ) ); double length; if ( k <= 0.0 || k >= 1.0 ) { length = direct_length; } else { point h; double r; h.x = a.x * k + b.x * ( 1 - k ); h.y = a.y * k + b.y * ( 1 - k ); h.z = a.z * k + b.z * ( 1 - k ); r = len( h, c ); if ( r >= R ) { length = direct_length; } else { double AC = len( a, c ); double BC = len( b, c ); double theta_aR = ( R >= AC ) ? 0 : acos( R / AC ); double theta_bR = ( R >= BC ) ? 0 : acos( R / BC ); double theta_ar = ( r >= AC ) ? 0 : acos( r / AC ); double theta_br = ( r >= BC ) ? 0 : acos( r / BC ); length = R * tan( theta_aR ) + R * tan( theta_bR ) + R * ( theta_ar + theta_br - theta_aR - theta_bR ); } } // printf( "%d.%02d\n", ( int ) floor( length ), ( ( int ) floor( length * 100 + 0.5 ) ) % 100 ) ; printf( "%.02f\n", length ); return 0; }