简单的题意,要注意z2 = h2*0.9-r2

#include <iostream>
#include <cmath>
#include <vector>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
using namespace std;#define MAX_N 110/*------------------常量区-------------------*/const double INF        = 1e10;      // 无穷大
const double EPS        = 1e-8;      // 计算精度
const double PI         = acos(-1.0);// PI
const int PINXING       = 0;         // 平行
const int XIANGJIAO     = 1;         // 相交
const int XIANGLI       = 0;         // 相离
const int GONGXIAN      = 2;         // 共线
const int CHONGDIE      = -1;        // 重叠
const int INSIDE        = 1;         // 点在图形内部
const int OUTSIDE       = 0;         // 点在图形外部
const int BORDER        = 2;         // 点在图形边界/*-----------------类型定义区----------------*/struct Point {              // 二维点或矢量double x, y;//double angle, dis;
    Point() {}Point(double x0, double y0): x(x0), y(y0) {}void read(){scanf("%lf%lf",&x,&y);}
};struct Line {               // 二维的直线或线段
    Point p1, p2;Line() {}Line(Point p10, Point p20): p1(p10), p2(p20) {}void read(){scanf("%lf%lf%lf%lf",&p1.x,&p1.y,&p2.x,&p2.y);}
};struct Rect {              // 用长宽表示矩形的方法 w, h分别表示宽度和高度double w, h;Rect() {}Rect(double _w,double _h) : w(_w),h(_h) {}
};
struct Rect_2 {             // 表示矩形,左下角坐标是(xl, yl),右上角坐标是(xh, yh)double xl, yl, xh, yh;Rect_2() {}Rect_2(double _xl,double _yl,double _xh,double _yh) : xl(_xl),yl(_yl),xh(_xh),yh(_yh) {}
};
struct Circle {            //圆
    Point c;double r;Circle() {}Circle(Point _c,double _r) :c(_c),r(_r) {}
};typedef vector<Point> Polygon;      // 二维多边形
typedef vector<Point> Points;       // 二维点集/*-------------------基本函数区---------------------*/inline double max(double x,double y)
{return x > y ? x : y;
}
inline double min(double x, double y)
{return x > y ? y : x;
}
inline bool ZERO(double x)              // x == 0
{return (fabs(x) < EPS);
}
inline bool ZERO(Point p)               // p == 0
{return (ZERO(p.x) && ZERO(p.y));
}inline bool EQ(double x, double y)      // eqaul, x == y
{return (fabs(x - y) < EPS);
}
inline bool NEQ(double x, double y)     // not equal, x != y
{return (fabs(x - y) >= EPS);
}
inline bool LT(double x, double y)     // less than, x < y
{return ( NEQ(x, y) && (x < y) );
}
inline bool GT(double x, double y)     // greater than, x > y
{return ( NEQ(x, y) && (x > y) );
}
inline bool LEQ(double x, double y)     // less equal, x <= y
{return ( EQ(x, y) || (x < y) );
}
inline bool GEQ(double x, double y)     // greater equal, x >= y
{return ( EQ(x, y) || (x > y) );
}// 输出浮点数前,防止输出-0.00调用该函数进行修正!
inline double FIX(double x)
{return (fabs(x) < EPS) ? 0 : x;
}/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
//-------------------3D 区域----------------------------//

struct Point3D {            //三维点或矢量double x, y, z;Point3D() {}Point3D(double x0, double y0, double z0): x(x0), y(y0), z(z0) {}
};struct Line3D {             // 三维的直线或线段
    Point3D p1, p2;Line3D() {}Line3D(Point3D p10, Point3D p20): p1(p10), p2(p20) {}
};inline bool ZERO(Point3D p)              // p == 0
{return (ZERO(p.x) && ZERO(p.y) && ZERO(p.z));
}//
//三维矢量运算
bool operator==(Point3D p1, Point3D p2)
{return ( EQ(p1.x, p2.x) && EQ(p1.y, p2.y) && EQ(p1.z, p2.z) );
}
bool operator<(Point3D p1, Point3D p2)
{if (NEQ(p1.x, p2.x)) {return (p1.x < p2.x);} else if (NEQ(p1.y, p2.y)) {return (p1.y < p2.y);} else {return (p1.z < p2.z);}
}
Point3D operator+(Point3D p1, Point3D p2)
{return Point3D(p1.x + p2.x, p1.y + p2.y, p1.z + p2.z);
}
Point3D operator-(Point3D p1, Point3D p2)
{return Point3D(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
}
Point3D operator*(Point3D p1, Point3D p2) // 计算叉乘 p1 x p2
{return Point3D(p1.y * p2.z - p1.z * p2.y,p1.z * p2.x - p1.x * p2.z,p1.x * p2.y - p1.y * p2.x );
}
double operator&(Point3D p1, Point3D p2) { // 计算点积 p1·p2return (p1.x * p2.x + p1.y * p2.y + p1.z * p2.z);
}
double Norm(Point3D p) // 计算矢量p的模
{return sqrt(p.x * p.x + p.y * p.y + p.z * p.z);
}//求三维空间中两点间的距离
double Dis(Point3D p1, Point3D 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));
}
// 求三维空间中点到直线的距离
double Dis(Point3D p, Line3D L)
{if(L.p1==L.p2) return Dis(p, L.p1);return Norm((p - L.p1) * (L.p2 - L.p1)) / Norm(L.p2 - L.p1);
}bool OnLine(Point3D p, Line3D L) // 判断三维空间中点p是否在直线L上
{if(L.p1==L.p2 && p==L.p1) return true;//共点时,返回truereturn ZERO( (p - L.p1) * (L.p2 - L.p1) );
}
bool OnLineSeg(Point3D p, Line3D L) // 判断三维空间中点p是否在线段l上
{return ( ZERO((L.p1 - p) * (L.p2 - p)) &&EQ( Norm(p - L.p1) + Norm(p - L.p2), Norm(L.p2 - L.p1)) );
}///*---------------------代码区---------------------------*/int main(int argc, const char * argv[]) {int T;cin>>T;while(T--){double h1,r1,x1,y1,z1;cin>>h1>>r1>>x1>>y1>>z1;z1 += h1-r1;double h2,r2,x2,y2,z2;double x3,y3,z3;cin>>h2>>r2>>x2>>y2>>z2;cin>>x3>>y3>>z3;z2 += h2*0.9-r2;Point3D p(x1,y1,z1);Point3D p1(x2,y2,z2),p2(x2+100*x3,y2+100*y3,z2+100*z3);if( LEQ(Dis(p, p1), r1) ){printf("YES\n");continue;}Line3D l(p1,p2);double dis=Dis(p,l);if( GT( dis,r1 ) ){printf("NO\n");}else{Point3D p3(x3,y3,z3);//然后判断射线与球相交.if( LEQ( ((p1-p)&p3),0 ) ){printf("YES\n");}else printf("NO\n");}}return 0;
}

hdu1174(3维射线与圆是否相交)相关推荐

  1. 射线与圆、球相交检测

    射线与圆.球相交检测 本篇讨论2D中射线和圆的相交检测,本方法同样适用于3D中射线和球的相交检测,这是因为可以在包含射线和球心的平面中进行检测,从而将3D问题转化为2D问题.如果射线穿过球心,那么平面 ...

  2. c++中射线表示_射线与球的相交测试

    chopper:目录​zhuanlan.zhihu.com 本节将描述两种射线与球体的相交测试方法,方法一是采用参数方程求解的方法,可以计算出直线.射线.线段与球的交点,方法二在Akenine-Möl ...

  3. Algorithm:C++语言实现之概率算法相关问题(计算机中的概率事件、C语言中的随机事件、产生二维随机数、圆内均匀取点)

    Algorithm:C++语言实现之概率算法相关问题(计算机中的概率事件.C语言中的随机事件.产生二维随机数.圆内均匀取点) 目录 一.概率 1.计算机中的概率事件 1.1.C语言中的随机事件 1.2 ...

  4. 射线和三角形的相交检测(ray triangle intersection test)

    http://www.cnblogs.com/graphics/archive/2010/08/09/1795348.html 本文以Fast, Minimum Storage Ray Triangl ...

  5. 土木搬砖工图形学学习之路——射线与包围盒的相交测试

    本人土木转计算机,目前刚刚开始研究生生涯.最近喜欢上了三维计算机图形学,被射线与包围盒的相交测试函数卡了许久,以下分享一些个人的学习理解. 一.结构体定义 包围盒定义为三维空间中一个立方体,其六个面分 ...

  6. 三角形与圆的相交问题

    大体思路:可以将三角形转化成线段与圆相交.那么三角形与圆相交可以分为如下几种情况: 第一种情况:三角形的三个顶点都在圆内,此时只需要判断三个顶点到圆心的距离都小于R即可: 第二种情况:三角形有至少一个 ...

  7. java 课后习题 判断两个圆是否相交 圆和直线的位置关系

    知识点: 1.点到直线的距离公式 d = Ax +By +C = 0 根号 A^2+B ^2 2.直线方程的一般式 Ax + Bx + C = 0 A = y2 -y1 B =x1 -x2 C = x ...

  8. 【JAVA 第四章 流程控制语句】课后习题 判断两个圆是否相交 圆和直线的位置关系

    知识点: 1.点到直线的距离公式 d = Ax +By +C = 0 根号 A^2+B ^2 2.直线方程的一般式 Ax + Bx + C = 0 A = y2 -y1 B =x1 -x2 C = x ...

  9. UVa - 12617 - How Lader

    先上题目:   How Lader  Lader is a game that is played in a regular hexagonal board (all sides equal, all ...

最新文章

  1. 企业管理难题:团队协作
  2. cnc加工中心保养表_CNC数控加工中心,硬轨的好还是线轨的好?
  3. Webform(Linq高级查、分页、组合查询)
  4. IEEE的论文需要注意的一些
  5. https下不加www的强制跳转 - Nginx
  6. 见良:学习多媒体主要靠实践
  7. CDATA C#操作XML(无命名空间),添加/删除/编辑节点
  8. Linux中samba的权限详解,活用三种权限 理解Samba的权限控制
  9. 程序员面试金典 - 面试题 03.06. 动物收容所(队列)
  10. Spring Boot 热部署 devtools模块
  11. drools的可升级读写锁探究
  12. mysql InnoDb存储引擎索引
  13. 58 - 算法 -分治问题 - 循环 二分查找 OpenJudge 百练 4143和为给定数
  14. 7 招教你轻松搭建以图搜图系统!
  15. MySQL-快速入门(13)MySQL日志
  16. linux不要了装windows,从windows到linux —— 装linux吧,你不要怕!
  17. 蒙特卡洛模型——有约束的非线性规划问题
  18. 每日单词20110501
  19. ArcGIS API for iOS在俄勒冈大学校园中的创新应用
  20. 南网优惠电费接口API源码

热门文章

  1. php ahp和jhp,php7.4编译(centos)
  2. ios uiview 如何刷新_ios – 从另一个UIViewController刷新表
  3. winform响应时间最长是多少分钟_了解这个,你的爬升勋章分分钟手到擒来!
  4. git分支操作的成功案例
  5. linux移植会话层层协议,Linux内核移植-南京林业大学毕业设计.DOC
  6. php指定异常状态码,php怎么设置状态码
  7. python计算能够包含两个圆的最小圆
  8. com.xxl.rpc.util.XxlRpcException: java.lang.IllegalStateException: failed to create a child event lo
  9. HDFS的访问方式之HDFS shell的常用命令
  10. Winform中DevExpress的TreeList的入门使用教程(附源码下载)