g[add.a][add.b]=g[add.b][add.c]=g[add.c][add.a]=num;
F[num++]=add;
}
for(i=4;i
dfs(i,j);
break;
}
}
}
tmp=num;
for(i=num=0;i
}
}
double area(){//表面积
double res=0.0;
if(n==3){
Point p=cross(P[0],P[1],P[2]);
res=vlen(p)/2.0;
return res;
}
for(int i=0;i
return res/2.0;
}
double volume(){//体积
double res=0.0;
Point tmp(0,0,0);
for(int i=0;i
return fabs(res/6.0);
}
int triangle(){//表面三角形个数
return num;
}
int polygon(){//表面多边形个数
int i,j,res,flag;
for(i=res=0;i
for(j=0;j if(same(i,j)){
flag=0; break;
}
res+=flag;
}
}
return res;
}
Point getcent(){//求凸包质心
Point ans(0,0,0),temp=P[F[0].a];
for(int i=0;i
Point p1=P[F[i].a],p2=P[F[i].b],p3=P[F[i].c];
t2 = volume(temp,p1,p2,p3)/6.0;//体积大于0,也就是说,点 temp 不在这个面上
if(t2>0){
ans.x += (p1.x+p2.x+p3.x+temp.x)*t2;
ans.y += (p1.y+p2.y+p3.y+temp.y)*t2;
ans.z += (p1.z+p2.z+p3.z+temp.z)*t2;
v += t2;
}
}
}
ans.x /= (4*v); ans.y /= (4*v); ans.z /= (4*v);
return ans;
}
double function(Point fuck){//点到凸包上的最近距离(枚举每个面到这个点的距离)
double min=99999999;
for(int i=0;i
Point p1=P[F[i].a] , p2=P[F[i].b] , p3=P[F[i].c];
double a = ( (p2.y-p1.y)*(p3.z-p1.z)-(p2.z-p1.z)*(p3.y-p1.y) );
double b = ( (p2.z-p1.z)*(p3.x-p1.x)-(p2.x-p1.x)*(p3.z-p1.z) );
double c = ( (p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x) );
double d = ( 0-(a*p1.x+b*p1.y+c*p1.z) );
double temp = fabs(a*fuck.x+b*fuck.y+c*fuck.z+d)/sqrt(a*a+b*b+c*c);
if(temp
}return min;
}
};
//CH3D hull;
int main()
{
int i,n;
while(~scanf("%d",&n)){
CH3D hull;
memset(g,0,sizeof(g));
memset(hull.P,0,sizeof(hull.P));
hull.n = n; www.2cto.com
for(i=0;i
}
hull.pretreat();
Point temp=hull.getcent();
printf("%.3lf\n",hull.function(temp));
}
return 0;
}