HDU 2436 - Collision Detection

转载 2015年11月17日 19:35:05

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; }

【计算几何】 HDOJ 2436 Collision Detection

问一个长方形和一个圆有没有接触。。。。 对每一维独立考虑,每一维都取最接近的值就行了。。。。 #include #include #include #include #include...
  • blankcqk
  • blankcqk
  • 2015年02月13日 19:50
  • 434

Unity-Rigidbody【刚体】组件-Collision Detection碰撞检测模式

Continous适用于将有可能会被高速移动物体撞上的物体。 Unity物体的Rigidbody组件提供了一个Collision Detection的属性,该属性用于更改物体的碰撞检测模式————一共...
  • Ming991301630
  • Ming991301630
  • 2017年09月10日 15:32
  • 279

Real Time Collision Detection

2015-10-18      花了几天时间浏览了一遍,发现这本书真的是很不错的。 前一段时间看过的那本《游戏物理引擎开发》中只有一个Part 来将 collision detect...
  • cloudqiu
  • cloudqiu
  • 2017年02月10日 14:00
  • 306

hdoj 2436 Collision Detection(数学型计算几何)

【题目大意】:判断一个长方体与一个球体是否接触 【解题思路】:接触的话也即存在一个点(x,y)成立:r*r>=(x-cx)*(x-cx)+(y-cy)*(y-cy)+(z-cz)*(z-cz...
  • new_wu
  • new_wu
  • 2012年02月29日 01:02
  • 515

Pixel Perfect Collision Detection (Using Cocos2d-x)

// // CollisionDetection.h // Created by Mudit Jaju on 30/08/13. // // SINGLETON class for checki...
  • z104207
  • z104207
  • 2014年04月16日 18:21
  • 1918

‘PitchMatrix3D’不是‘Matrix3D’的成员——linux下编译碰撞检测包ColDet

ColDet是一个非常著名的开源碰撞检测包。我下载之后,使用包中自带的makefile.g++编译它,出现了一些bug: g++ -c -O2 -DGCC coldet.cpp In file ...
  • qtyl1988
  • qtyl1988
  • 2013年01月19日 14:23
  • 1416

hdu 5114 Collision

hdu 5114 Collision 题意:平面n*m的空间有两个点在(x1,y1),(x2,y2) 向(1,1)运动,遇到边界反弹,最早在哪一点相遇。 分析  (1)答案只可能在...
  • zz490396674
  • zz490396674
  • 2014年11月30日 22:16
  • 734

collision detection

#pragma once #include "cocos2d.h" #include "Box2D/Box2D.h" class MyContact { public: MyCon...
  • xiewenbo
  • xiewenbo
  • 2013年10月14日 20:54
  • 452

hdu4793Collision

2013年亚洲区域赛长沙站的几何题,就是告诉你两个圆(大圆和小圆),同心的,再告诉你一个小小圆在大圆外面,再告诉你小小圆的运动速度(矢量),如果碰到小圆就原路返回,如果碰不到就穿过大圆,问你小小圆在大...
  • zh9406
  • zh9406
  • 2015年04月14日 10:46
  • 439

Collision Detection Tutorial

While Box2D handles all the collision detection and resolution of the physics, it would also be usef...
  • guzicheng
  • guzicheng
  • 2011年02月18日 11:02
  • 866
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 2436 - Collision Detection
举报原因:
原因补充:

(最多只允许输入30个字)