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
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
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
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; }
本文详细阐述了如何通过碰撞检测算法来判断一个球与立方体是否相交,包括数学原理和代码实现,对于游戏开发、物理仿真等领域具有重要意义。

2077

被折叠的 条评论
为什么被折叠?



