Ellipsoid
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1140 Accepted Submission(s): 412
Special Judge
your task is to find the minimal distance between the original point (0,0,0) and points on the ellipsoid. The distance between two points (x1,y1,z1) and (x2,y2,z2) is defined as
For each testcase, one line contains 6 real number a,b,c(0 < a,b,c,< 1),d,e,f(0 ≤ d,e,f < 1), as described above. It is guaranteed that the input data forms a ellipsoid. All numbers are fit in double.
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
const double sp=0.99,eps=1e-8;
double a,b,c,d,e,f,M=1e9;
double dirx[]={-1,-1,-1,0,0,1,1,1};
double diry[]={-1,0,1,-1,1,-1,0,1};
double dis(double x,double y,double z)
{
return sqrt(x*x+y*y+z*z);
}
double getz(double x,double y)
{
double A=0,B=0,C=0;
A=c;
B=d*y+e*x;
C=a*x*x+b*y*y+f*x*y-1;
double delta=B*B-4*A*C;
if(delta<0) return M;
double z1=(sqrt(delta)-B)/(2.0*A),z2=(-sqrt(delta)-B)/(2.0*A);
if(z1*z1<z2*z2) return z1;
return z2;
}
double solve()
{
double x=0,y=0,z=0,tx=0,ty=0,tz=0,step=1;
z=getz(x,y);
while(step>eps)
{
for(int i=0;i<8;i++)
{
tx=x+dirx[i]*step;
ty=y+diry[i]*step;
tz=getz(tx,ty);
if(tz>=M) continue;
if(dis(tx,ty,tz)<dis(x,y,z))
{
x=tx,y=ty,z=tz;
}
}
step*=sp;
}
return dis(x,y,z);
}
int main()
{
while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f)!=EOF)
{
printf("%.8lf\n",solve());
}
return 0;
}