Electron Cloud

 

Electron Cloud

Time Limit: 2 Seconds      Memory Limit: 65536 KB

The electron is described in terms of its probability distribution or probability density. This probability distribution does not have definite cutoff points; its edges are somewhat fuzzy. Hence the term "electron cloud." This cloudy probability distribution takes on different shapes, depending on the state of the atom.

In order to describe a nuclear action, you are asked to tell where the electrons may occur.

Here we assume that the electrons only occur within a sphere whose location and radius are given. The action consists of only two atoms.

Input

There are multiple test cases. The first line of input is an integer T indicating the number of test cases. (0 < T ≤ 50)

Each test case consists of a line containing 8 integers X1Y1Z1R1X2Y2Z2 and R2, describing the coordinates and the radiuses of the two atoms. The absolute value of each coordinate do not exceed 100 and 0 < R1R2 ≤ 100.

Output

For each test case, output the volume of space where the electrons may occur, accurated to the nearest 0.01.

Sample Input

 

0 0 0 1 0 0 2 1 
0 0 0 2 0 0 2 2 
0 0 0 2 0 0 2 1 

 

Sample Output

 

8.38 
56.55 
36.00

 

 Sample code:

 #include<stdio.h>

#include<math.h>
#define PI acos(-1.0)
struct point
{
     
double x,y,z;
     
double r;
}p1,p2;

double dis(point a,point b)
{
     
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z));
}

double V(double r)
{
     
return (4.0/3)*PI*r*r*r;
}

double V2(double r,double h)
{
     
return (2.0/3)*PI*r*r*h-(1.0/3)*PI*(r-h)*(r*r-(r-h)*(r-h));
}

void swap(double &a,double &b)
{
     
double t;
     t
=a;
     a
=b;
     b
=t;
}

void volumn(point p1,point p2)
{
     
double d=dis(p1,p2);
     
if(p1.r<p2.r) swap(p1.r,p2.r);
     
if(p1.r+p2.r<=d)
       printf(
"%.2f\n",V(p1.r)+V(p2.r));
     
else if(d<=p1.r-p2.r)
       printf(
"%.2f",V(p1.r));
     
else
     {
          
double r1=p1.r,r2=p2.r;
          
double t=(r1*r1-r2*r2)/d;
          
double h1=(d+t)/2;
          
double h2=(d-t)/2;
          h1
=(r1-h1);
          h2
=(r2-h2);
          
double ans=V(p1.r)+V(p2.r)-V2(p1.r,h1)-V2(p2.r,h2);
          printf(
"%.2f\n",ans);
        }
}

int main()
{
     
int n;
     scanf(
"%d",&n);
     
while(n--)
     {
          scanf(
"%lf%lf%lf%lf",&p1.x,&p1.y,&p1.z,&p1.r);
          scanf(
"%lf%lf%lf%lf",&p2.x,&p2.y,&p2.z,&p2.r);
          volumn(p1,p2);
        }
     
return 0;

} 

 

posted @ 2011-05-19 17:13  cpoint  阅读(372)  评论(0编辑  收藏  举报
浏览次数:travelocity promotion codes