Adding some more judges, here and there.
[and.git] / lib / Documentation / docs-sonyckson / 1075.cpp
blobbe2c8549d6b1128a29083fefb4794ee850091de4
1 // THREAD IN THE SPACE....
3 #include <cstdio>
4 #include <cmath>
5 #include <cstdlib>
6 typedef struct{
7 double x, y , z;
8 }point;
9 void read(point & A){
10 scanf("%lf %lf %lf", &(A.x), &(A.y), &(A.z));
12 double dist(point p1, point p2){
13 return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y) + (p1.z-p2.z)*(p1.z-p2.z));
15 double Pi;
16 double acos1(double x){
17 if( x > 1 ) x = 1;
18 if( x < -1 ) x = -1;
19 double res = acos(x);
20 while( res < 0.0 ) res += 2.0*Pi;
21 if( res >= Pi ) res = 2.0*Pi - res;
22 return res;
26 int main(){
27 int i,j ,k;
28 Pi = acos(-1.0);
29 point A, B, C;
30 read(A), read(B), read(C);
31 if( A.x == B.x && A.y == B.y && A.z == B.z ){
32 printf("0.00\n");
33 return 0;
35 double R;
36 scanf("%lf", &R);
37 double dab, dbc, dac;
38 dab = dist(A, B);
39 dbc = dist(B, C);
40 dac = dist(A, C);
41 double s = (dab+dbc+dac)/2.0;
42 double area = sqrt(s*(s-dac)*(s-dbc)*(s-dab));
43 double alt = (area*2.0)/dab;
44 if( fabs(alt-R) < 1e-7 || alt > R ){
45 printf("%.2lf\n", dab);
46 return 0;
48 if (((dac*dac + 1e-7) >= (dab *dab+ dbc*dbc)) || ((dbc*dbc+1e-7) >= dab*dab+ dac*dac)){
50 printf("%.2lf\n", dab);
51 return 0;
53 double l1, l2;
54 l1 = sqrt(dac*dac - R * R);
55 l2 = sqrt(dbc*dbc - R * R);
56 double angleacb, anglel1ca, anglel2cb;
57 double a, b, c;
58 c = dab;
59 b = dbc, a = dac;
60 angleacb = acos1((c*c-a*a-b*b)/(-2.0*a*b));
62 c = l1, b = R, a = dac;
63 anglel1ca = acos1((c*c-a*a-b*b)/(-2.0*a*b));
65 c = l2; a = dbc;
66 anglel2cb = acos1((c*c-a*a-b*b)/(-2.0*a*b));
68 double alfa = angleacb - anglel1ca - anglel2cb;
70 double di = (Pi*(R+R)) * alfa / (2.*Pi);
72 printf("%.2lf\n",( di + l1 + l2 ));
73 return 0;