/**//* 判断一个长方体与一个球体是否接触 接触的话也即存在一个点(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; }
|