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

HDU 1174:http://acm.hdu.edu.cn/showproblem.php?pid=1174

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

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

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

更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Programming/sjjg/

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

HDU 1174

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索return
, double
, point
, 直线
, ret
n个直线
hdu1174、三维直线方程、三维空间直线方程、三维空间中的直线方程、matlab 三维直线拟合,以便于您获取更多的相关知识。

时间: 2024-10-27 09:45:18

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

怎么用计算几何解决这个问题?

问题描述 怎么用计算几何解决这个问题? 先给你一个简单的例子,已知8个点坐标,实际上是一个立方体的8个顶点坐标,通过程序实现这是一个立方体,由6个面构成,每个面又由4条线构成,每条线又由2个点构成.每个元素(点,线,面)都要能够通过程序检索信息,比如说线的长度,面的面积.这个用计算几何怎么解决 解决方案 http://zhidao.baidu.com/link?url=JjJ-o5Hs8tMAX9s26k3xWC_ylx-QQpmZH3WfxH6If0NE_9xykbQcwBtkvZ2e9oFH

HDU 4741 空间几何求两直线距离最近点

给出两直线经过的两点,没有平行的情况,求两直线最短距离和最短距离的两点. #include <iostream> #include <string.h> #include <stdio.h> #include <math.h> using namespace std; const double eps = 1e-8; //三维空间点 struct Point { double x, y, z; Point(double x=0,double y=0,doub

hdu 3584 Cube

点击打开hdu 3584 思路: 三维树状数组 分析: 1 点击打开查看论文  建议先看看这篇论文,然后就懂了,裸的三维树状数组 代码: /************************************************ * By: chenguolin * * Date: 2013-08-21 * * Address: http://blog.csdn.net/chenguolinblog * ******************************************

详细介绍Z-Buffer与W-Buffer

Depth-Buffer(深度缓存)有两种:Z-Buffer 和 W-Buffer,这里讨论这两种深度缓存的区别,以及如何在两者之间转换. w 的含义 3D空间点的坐标是(x,y,z),为了使矩阵乘法具有平移变换的功效,我们用4D空间中的点(x,y,z,w)来表示3D空间中的点(x',y',z'),这两个不同空间点之间的关系是: x' = x / w y' = y / w z' = z / w 像这样用四维空间点表示三维空间点,或者说用 n + 1 维空间点表示 n 维空间点的方法叫做 "齐次坐

OpenCASCADE Rational Bezier Curves

OpenCASCADE Rational Bezier Curves eryar@163.com Abstract. Although polynomials offer many advantages, there exist a number of important curve and surface types which cannot be represented precisely using polynomials, e.g., circles, ellipses, hyperbo

求圆心

        最近为了研究最小覆盖圆,需要求圆心,所以随手download了几份资料. 若是平面点得到的是平面圆,若是三维空间点得到的是空间圆(不是球). 一.第一种方法 这种方法当k1或者k2为0时需要分别讨论,不便于计算机编程实现. 二.第二种方法         这种方法下只要三点不共线就有结果,三点共面的充要条件是混合积(a*(bXc))为0.

HDU 1140 War on Weather:三维点之间距离

HDU 1140:http://acm.hdu.edu.cn/showproblem.php?pid=1140 大意:地球球心是(0,0,0),给你k个卫星以及k个卫星的三维坐标(以球心为基准),m个地球上的点以及m个点的三维坐标(以球心为基准),问有多少个点是能被卫星覆盖到的,输出数量. 思路: 求出卫星与地球切线的长度,在地球上,与卫星连线的长度小于切线长度的肯定都能看到. 更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/Program

HDU 3662 三维凸包表面多边形个数

题意:求三维凸包表面多边形个数. 我是来试模板的= = #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<stdlib.h> using namespace std; const int MAXN=1050; const double eps=1e-8; struct Point { double x,y,z; Point() {}

hdu 1527

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1527 hint:威佐夫博弈 基本类似于模板 #include <iostream> #include <cmath> #include <cstdio> using namespace std; const double q = (1 + sqrt(5.0)) / 2.0; // 黄金分割数 int Wythoff(int a, int b) { if (a > b)