HDU1174 爆头 叉积求距离

几何题。

要判断警察是否能爆头,我们只需判断匪徒头中心到子弹轨迹的距离是否小于匪徒头部半径即可。由于题中没给出直线方程,这能借助方向向量,很自然就想到了叉乘求距离。

  点B到直线AC的距离 |AB X AC|/|AC|   ‘X’是叉乘   ’ || ‘表示模 ;

那么这题就没什么多说的了

#include <cstdio>
#include <cmath>
using namespace std;
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        double h1,r1,x1,y1,z1;
        double h2,r2,x2,y2,z2,x3,y3,z3;
        scanf("%lf%lf%lf%lf%lf",&h1,&r1,&x1,&y1,&z1);
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&h2,&r2,&x2,&y2,&z2,&x3,&y3,&z3);
        double k1=z1+h1-r1;//匪徒的头部中点位置
        double k2=z2+0.9*h2-r2;//警察头部中点位置
        double a=x1-x2,b=y1-y2,c=k1-k2;//匪徒头部中点与警察头部中点的连线向量
        double a1=b*z3-y3*c,b1=a*z3-x3*c,c1=a*y3-b*x3;//枪的向量与匪徒、警察的头部向量的叉乘
        double dis=(a1*a1+b1*b1+c1*c1)/(x3*x3+y3*y3+z3*z3);//枪的距离与匪徒的距离的平方
        if(dis<=r1*r1&&(a*x3+b*y3+c*z3>0))
            printf("YES\n");
        else
            printf("NO\n");
    }
    return 0;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值