关闭

HDU 2436 - Collision Detection

201人阅读 评论(0) 收藏 举报
分类:

Collision Detection


记圆心为(x0, y0, z0)。
容易想到,计算长方体上离圆心最近一点(x', y', z')到圆心的距离dismin就可以判断出YES和NO。
由于“长方体的每条边和坐标轴平行”(这个条件非常重要),可以知道长方体上任意一点左边(x, y, z)满足xmin<=x<=xmax, y,z相同。而xmin, xmax等可以直接由长方体的八个顶点坐标得到。
从dismin^2=(x0-x)^2+(y0-y)^2+(z0-z)^2可以知道,要找到(x', y', z')这一点,其实xyz三个那种歌方向上是完全独立的,分别在xmin<=x<=xmax, ymin<=y<=ymax, zmin<=z<=zmax中间选取合适的x, y, z使(x0-x)^2、(y0-y)^2和(z0-z)^2都最小就可以了。


Description

      In physical simulations, video games and computational geometry, collision detection involves algorithms for checking for collision, i.e. intersection, of two given objects. Collision detection algorithms are a basic component of 3D video games. Without them, characters could go through walls and other obstacles. 
      Here comes an interesting problem, given a ball and a cuboid, you need to detect whether they collide. We say that two objects collide if and only if they share at least one point. 
 

Input

      The first line of input is the number of test cases. 
      Each test case contains two lines, the first line contains 24 integers X1, Y1, Z1, …, X8, Y8, Z8, representing the 8 vertexes of the cuboid. Vertexes are given in random order and you can make sure that all edges of the cuboid are parallel to coordinate axes; the second line contains 4 integers X,Y,Z,R representing the central point of the ball and its radius. All integers given are non-negative and will be less than 100000. 
 

Output

      For each case output "Yes" Or "No" on a single line.
 

Sample Input

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

Sample Output

Yes No
 


#include<iostream> #include<algorithm> using namespace std; const int INF = 1 << 30; struct Point { int x, y, z; } P[8]; struct Ball { int x, y, z, r; } B; int maxx, maxy, maxz, minx, miny, minz; inline void rebuild() { maxx = maxy = maxz = -INF; minx = miny = minz = INF; for(int i = 0; i < 8; i++) { maxx = max(P[i].x, maxx); maxy = max(P[i].y, maxy); maxz = max(P[i].z, maxz); minx = min(P[i].x, minx); miny = min(P[i].y, miny); minz = min(P[i].z, minz); } } //intersect in every aspect inline bool judge() { long long dx = 0; long long dy = 0; long long dz = 0; long long R = (long long)B.r * B.r; if(maxx >= B.x && minx <= B.x) dx = 0; else dx = min((long long)(maxx - B.x) * (maxx - B.x), (long long)(minx - B.x) * (minx - B.x)); if(maxy >= B.y && miny <= B.y) dy = 0; else dy = min((long long)(maxy - B.y) * (maxy - B.y), (long long)(miny - B.y) * (miny - B.y)); if(maxz >= B.z && minz <= B.z) dz = 0; else dz = min((long long)(maxz - B.z) * (maxz - B.z), (long long)(minz - B.z) * (minz - B.z)); return dx + dy + dz <= R; } int main() { int T; cin>>T; while( T-- ) { for(int i = 0; i < 8; i++) cin>>P[i].x>>P[i].y>>P[i].z; cin>>B.x>>B.y>>B.z>>B.r; rebuild(); if(judge()) cout<<"Yes"<<endl; else cout<<"No"<<endl; } return 0; }

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:6514次
    • 积分:378
    • 等级:
    • 排名:千里之外
    • 原创:31篇
    • 转载:9篇
    • 译文:0篇
    • 评论:0条