给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"Yes",否则输出"No"。(三角形的面积大于0)。

 
 
 

输入

第1行:一个数T,表示输入的测试数量(1 <= T <= 10000),之后每4行用来描述一组测试数据。
4-1:三个数,前两个数为圆心的坐标xc, yc,第3个数为圆的半径R。(-3000 <= xc, yc <= 3000, 1 <= R <= 3000)
4-2:2个数,三角形第1个点的坐标。
4-3:2个数,三角形第2个点的坐标。
4-4:2个数,三角形第3个点的坐标。(-3000 <= xi, yi <= 3000)

输出

共T行,对于每组输入数据,相交输出"Yes",否则输出"No"。

输入样例

2
0 0 10
10 0
15 0
15 5
0 0 10
0 0
5 0
5 5

输出样例

Yes
No 题意是求圆与三角形是否相交,即是否有交点,实际上就是求圆心到三边的距离,不过 要注意这里的边是线段,可不是求到直线的距离,如果三个点都在圆内或者圆心到三条边的距离都大于半径,那么就是不相交,其他的情况相交,
点与点之间的距离很好求,点到线的距离可以借助海伦公式,海伦公式求出点与边两点组成三角形的面积,而面积又等于点到直线的距离*边长/2,以此能求出点到直线距离,还要另外分点到直线距离不等于点到线段距离的情况。
还有精度问题,全程用浮点数,判断相等的情况要用到精度,不然可能出错。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#define MAX 101
#define eps 1e-6
using namespace std;
typedef pair<double,double> pa;
int t;
double r;
pa cir,a,b,c;
double ptop(pa x,pa y) {///点到点
return sqrt((x.first - y.first) * (x.first - y.first) + (x.second - y.second) * (x.second - y.second));
}
double ptol(pa p,pa la,pa lb) {///点到线
double x = ptop(p,la);
double y = ptop(p,lb);
double z = ptop(lb,la);
if(x * x >= y * y + z * z) return y;///不能用点到直线
if(y * y >= x * x + z * z) return x;///不能用点到直线
double hc = (x + y + z) / ;
return sqrt(hc * (hc - x) * (hc - y) * (hc - z)) * / z;///点到直线
}
bool check(pa p,double rr,pa x,pa y,pa z) {
if(ptop(cir,x) - rr < -eps && ptop(cir,y) - rr < -eps && ptop(cir,z) - rr < -eps
|| ptol(p,x,y) - rr > eps && ptol(p,z,y) - rr > eps && ptol(p,x,z) - rr > eps) return false;
return true;
} int main() {
scanf("%d",&t);
while(t --) {
scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf",&cir.first,&cir.second,&r,&a.first,&a.second,&b.first,&b.second,&c.first,&c.second);
if(check(cir,r,a,b,c)) puts("Yes");
else puts("No");
}
}

最新文章

  1. mysql 按距离今日时间最近排序
  2. html5-表单
  3. SharpGL学习笔记(十四) 材质:十二个材质球
  4. 生产者-消费者 用非阻塞队列、Object.wait()、Object.notify()实现
  5. [译]Quartz 框架 教程(中文版)2.2.x 之第一课 开始使用Quartz框架
  6. Inxi:获取Linux系统和硬件信息的神器
  7. UVaLive 6627 First Date (转换时间)
  8. Org-mode 任务添加提醒
  9. 在HTML下,如何为多个选择框提取数据并序列化
  10. 那些年被我坑过的Python——你来我往(第九章 selectors)
  11. 数据结构 --- 线性表学习(php模拟)
  12. vue1升级到vue2的问题
  13. Bzoj3930: [CQOI 2015] 选数 &amp; COGS2699: [CQOI 2015] 选数加强版
  14. BZOJ4423 Bytehattan
  15. x264源代码简单分析:x264命令行工具(x264.exe)
  16. 基于vue-simple-uploader封装文件分片上传、秒传及断点续传的全局上传插件
  17. Note of Jieba ( 词云图实例 )
  18. 《Pro SQL Server Internals, 2nd edition》
  19. c++ &lt;vector&gt;学习
  20. 解决C#调用执行js报检索 COM 类工厂中 CLSID 为 {0E59F1D5-1FBE-11D0-8FF2-00A0D10038BC} 组件失败

热门文章

  1. 解决Vim插入模式下backspace按键无法删除字符的问题【转】
  2. make install报错
  3. C语言查找算法之顺序查找、二分查找(折半查找)
  4. python之websocket
  5. 项目中如何使用EF
  6. javascript HTML DOM 简单介绍
  7. 用shell将时间字符串与时间戳互转
  8. Nginx 常用配置模板
  9. Electron中git, npm,webpack使用
  10. java调用cmd执行maven命令