HDU 1174 爆头(三维计算几何)
2013-07-27 10:22
281 查看
爆头
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1340 Accepted Submission(s): 542
Problem Description
gameboy是一个CS高手,他最喜欢的就是扮演警察,手持M4爆土匪的头。也许这里有人没玩过CS,有必要介绍一下“爆头”这个术语:所谓爆头,就是子弹直接命中对方的头部,以秒杀敌人。
现在用一个三维的直角坐标系来描述游戏中的三维空间(水平面为xoy平面,z轴正方向是上方)。假设游戏中角色的头是一个标准的球。告诉你土匪的身高,头部半径,所站位置的坐标;gameboy所控警察的身高,头部半径,所站位置的坐标,以及枪头所指方向的单位向量。gameboy所控警察所握的是M4,抢瞄准时枪膛中的子弹跟视线基本同线,我们忽略它们的距离,就当成同线。由于土匪手持AK47,所以他是很嚣张地正立着。而警察手持M4,正在瞄准,由于瞄准时身体微弯,视线从头心出发,他头部的实际高度比正立时低10%。
你的任务就是,计算gameboy在这一刻扣下扳机,能否爆土匪的头。注意:这里忽略子弹的直径和重力作用,也就是说子弹是无限小的,弹道是一条笔直的射线,警察与土匪间没有障碍物。并且只要子弹擦到头部,哪怕是边缘,也算爆头。
Input
测试数据的第一行有一个正整数T,表示有T组测试数据。每组数据的第一行有五个实数,h1,r1,x1,y1,z1,分别表示土匪的身高,头部半径以及所站的位置。第二行有八个实数,h2,r2,x2,y2,z2,x3,y3,z3,分别表示警察的身高,头部半径,所站位置,以及枪头所指方向的方向向量。
Output
每一组输入数据对应一行输出。如果能爆土匪的头,输出"YES",否则输出"NO"。
Sample Input
2
1.62 0.1 10.0 10.0 10.0
1.80 0.09 0.0 0.0 0.0 1.0 1.0 1.0
1.62 0.1 0.0 0.0 0.0
1.80 0.09 10.0 10.0 10.0 -1.0 -1.0 -1.0
Sample Output
YES
YES
Author
lwg
这个计算几何题目难度也不是很大
首先要注意一点就是子弹是有方向的,先判断土匪和开枪方向是否一致,这个只要计算一下开枪点和土匪头部圆心的连线,和开枪方向之间的cos值,如果为
正的说明方向一致,如果不是那么方向不一致
其次就是计算出土匪头部圆心,到开枪射线之间的距离,如果比土匪半径小,那么就OK,否则不OK!
#include <iostream> #include <string.h> #include <stdio.h> #include <cmath> #include <algorithm> using namespace std; #define eps 1e-8 #define inf 1e8 #define zero(x) (((x)>0?(x):-(X))<eps) struct point3 { double x; double y; double z; }temp,temp1,temp3; struct line3 { point3 a; point3 b; }; struct plane3 { point3 a; point3 b; point3 c; double r; }; point3 xmult(point3 u,point3 v) { point3 ret; ret.x=u.y*v.z-v.y*u.z; ret.y=u.z*v.x-u.x*v.z; ret.z=u.x*v.y-u.y*v.x; return ret; } double dis(point3 a,point3 b) { return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.z-b.z)*(a.z-b.z)); } double vlen(point3 p) { return sqrt(p.x*p.x+p.y*p.y+p.z*p.z); } double dmult(point3 u,point3 v) { return u.x*v.x+u.y*v.y+u.z*v.z; } point3 subt(point3 u,point3 v) { point3 ret; ret.x=u.x-v.x; ret.y=u.y-v.y; ret.z=u.z-v.z; return ret; } double linetoline(line3 u,line3 v) { point3 n=xmult(subt(u.a,u.b),subt(v.a,v.b)); return fabs(dmult(subt(u.a,v.a),n))/vlen(n); } double angle_cos(line3 u,line3 v) { return dmult(subt(u.a,u.b),subt(v.a,v.b))/vlen(subt(u.a,u.b))/vlen(subt(v.a,v.b)); } double ptoline(point3 p,line3 l) { return vlen(xmult(subt(p,l.a),subt(l.b,l.a)))/dis(l.a,l.b); } int main() { int t; point3 pos1,pos2,dir,head1,head2,dir1,dir2; double h1,r1,h2,r2,angle,d; line3 a,b; scanf("%d",&t); while(t--) { scanf("%lf%lf%lf%lf%lf",&h1,&r1,&pos1.x,&pos1.y,&pos1.z); scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&h2,&r2,&pos2.x,&pos2.y,&pos2.z,&dir.x,&dir.y,&dir.z); head1=pos1; head1.z+=(h1-r1); head2=pos2; head2.z+=(h2*0.9-r2); a.a=head2;//警察-》土匪 a.b=head1; b.a=head2; b.b=dir; b.b.x+=b.a.x; b.b.y+=b.a.y; b.b.z+=b.a.z; angle=angle_cos(a,b); if(angle <= -eps) { printf("NO\n"); continue; } d=ptoline(head1,b); if(d <= r1) printf("YES\n"); else printf("NO\n"); } return 0; }
相关文章推荐
- hdu 1174:爆头(计算几何,三维叉积求点到线的距离)
- Hdu 1174 爆头 计算几何问题
- HDU 1174 爆头(计算几何)
- HDU 1174 爆头 (计算几何)
- hdu 1174 爆头 (计算几何)
- hdu-1174 爆头(计算几何)
- HDU 1174 爆头 [计算几何]
- 三维计算几何模板 hdu 5733 tetrahedron(不知为何WA)
- HDU 1174 水几何计算
- Hdu 4617 Weapon (三维计算几何 异面直线距离)
- hdu 3320 计算几何(三维图形几何变换)
- HDU - 1174(计算几何)
- HDU 4741 Save Labman No.004 ( 三维计算几何 空间异面直线距离 )
- HDU 1174 爆头 几何
- HDU 4617 Weapon (简单三维计算几何,异面直线距离)
- HDU 4617 Weapon 三维计算几何
- HDU 1174 爆头(三维空间中求点线距离)
- HDU 5839 Special Tetrahedron (三维计算几何)
- HDU 4449 Building Design 第37届ACM/ICPC 金华赛区H题 (计算几何,三维凸包+空间坐标旋转+二维凸包)
- HDU 1174 题解(计算几何)