HDU 1174 爆头(三维空间点与直线关系)

HDU 1174


大意:中文题,很好理解,搞清楚各种变量就行。


思路:我知道的好像有两种解法,一种是求土匪的头心与子弹射出的直线求点到直线距离,在判断一下方向对不对;另一种是求出子弹射出点与土匪头心连线,求出子弹的射出的直线,求两直线的夹角, 求出子弹射出点与土匪头心连线,求出求出子弹射出点与土匪头的切线,求两直线的夹角,比较这两个夹角的大小判断是不是会打到。


这里我用第一种方法过的,就贴第一种的吧。

struct point
{
    double x, y, z;
} A, B, C;

///计算cross product U x V
point xmult(point u,point v){
	point 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 Distance(point p1,point p2){
	return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y)+(p1.z-p2.z)*(p1.z-p2.z));
}

///矢量差 U - V
point subt(point u,point v){
	point ret;
	ret.x=u.x-v.x;
	ret.y=u.y-v.y;
	ret.z=u.z-v.z;
	return ret;
}

///向量大小
double vlen(point p){
	return sqrt(p.x*p.x+p.y*p.y+p.z*p.z);
}

double ptoline(point p,point l1,point l2){
	return vlen(xmult(subt(p,l1),subt(l2,l1)))/Distance(l1,l2);
}

int n;
double h1,r1;
double h2,r2,x3,y3,z3;

void Solve()
{
    scanf("%d", &n);
    while(n--)
    {
        scanf("%lf%lf%lf%lf%lf", &h1, &r1, &A.x, &A.y, &A.z);
        scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &h2, &r2, &B.x, &B.y, &B.z, &C.x, &C.y, &C.z);

        A.z = A.z+h1-r1;
        B.z = B.z+h2*0.9-r2;

        double x = A.x-B.x;
        double y = A.y-B.y;
        double z = A.z-B.z;
        //printf("%lf %lf %lf\n", x, y, z);

        point D;

        D.x = C.x+B.x;
        D.y = C.y+B.y;
        D.z = C.z+B.z;

        double d = ptoline(A, B, D);
        //printf("%lf\n", d);

        if(d <= r1 && (x*C.x+y*C.y+z*C.z > 0))
        {
            printf("YES\n");
        }
        else
        {
            printf("NO\n");
        }
    }
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值