 /**//*
判断一个长方体与一个球体是否接触
接触的话也即存在一个点(x,y)成立:
r*r>=(x-cx)*(x-cx)+(y-cy)*(y-cy)+(z-cz)*(z-cz)
我们要找到这个离球心最近的点,也即让各维abs(x-cx)越小!
分开对待各维(它们互不相关),
x=cx;
if(x>maxx)x=maxx;
if(x<minx)x=minx;
这样的x就是长方体内离cx最近的点的x坐标了,同理处理!!
*/
#include<cstdio>

 inline int min(int a,int b) {return a<b?a:b;}
 inline int max(int a,int b) {return a>b?a:b;}

int main()
  {
int T;
scanf("%d",&T);
while(T--)
 {
int x,y,z,cx,cy,cz,r;
int minx,maxx,miny,maxy,minz,maxz;
scanf("%d%d%d",&x,&y,&z);
minx=maxx=x;
miny=maxy=y;
minz=maxz=z;
for(int i=1;i<8;i++)
 {
scanf("%d%d%d",&x,&y,&z);
minx=min(x,minx);maxx=max(x,maxx);
miny=min(y,miny);maxy=max(y,maxy);
minz=min(z,minz);maxz=max(z,maxz);
}
scanf("%d%d%d%d",&cx,&cy,&cz,&r);
x=cx,y=cy,z=cz;
if(x>maxx)x=maxx;
if(x<minx)x=minx;
if(y>maxy)y=maxy;
if(y<miny)y=miny;
if(z>maxz)z=maxz;
if(z<minz)z=minz;
puts((long long)r*r>=(long long)(x-cx)*(x-cx)+(long long)(y-cy)*(y-cy)+(long long)(z-cz)*(z-cz)?"Yes":"No");
}
return 0;
}
|