226人阅读 评论(0)

# Collision Detection

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网站的观点或立场
个人资料
• 访问：8184次
• 积分：393
• 等级：
• 排名：千里之外
• 原创：31篇
• 转载：9篇
• 译文：0篇
• 评论：0条
评论排行