51Nod 1298 圆与三角形(计算几何)
1298 圆与三角形 
基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题
给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"Yes",否则输出"No"。(三角形的面积大于0)。


Input
第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)
Output
共T行,对于每组输入数据,相交输出"Yes",否则输出"No"。
Input示例
2
0 0 10
10 0
15 0
15 5
0 0 10
0 0
5 0
5 5
Output示例
Yes
No
题解:
通过顶点和圆心的距离将三角形和圆关系分为三类:
1、部分顶点在圆内,此时必定相交;
2、全部顶点在圆内,此时必定不相交;
3、全部顶点在圆外,此时可能相交也可能不相交;
对于第3种情况,我们知道只有同时符合以下两种情况是圆与三角形相交
1、圆心到直线距离小于等于半径;d<=r;

2、对应边和两顶点与圆心连线夹角为锐角(此时和圆心相距最短点在线段上);
#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
double a,b,r;
struct node{
double x,y;
}p[4];
bool check()
{
double A,B,C,D,E,F;
for(int i=1;i<=3;i++)
for(int j=i+1;j<=3;j++){
A=p[j].y-p[i].y;
B=p[i].x-p[j].x;
C=p[j].x*p[i].y-p[i].x*p[j].y;
D=(A*a+B*b+C)*(A*a+B*b+C);
if(D<=(A*A+B*B)*r*r){//圆心到该直线的距离小于半径
E=(a-p[i].x)*(p[j].x-p[i].x)+(b-p[i].y)*(p[j].y-p[i].y);//向量相乘
F=(a-p[j].x)*(p[i].x-p[j].x)+(b-p[j].y)*(p[i].y-p[j].y);
if(E>0&&F>0)//两顶点对应夹角为锐角说明最小距离在两顶点之间
return 1;//找到相交边
}
}
return 0;
}
int main()
{
int T,cnt;
scanf("%d",&T);
while(T--)
{
cnt=0;//记录圆内三角形顶点个数
scanf("%lf%lf%lf",&a,&b,&r);
for(int i=1;i<=3;i++){
scanf("%lf%lf",&p[i].x,&p[i].y);//输入三个顶点
if((p[i].x-a)*(p[i].x-a)+(p[i].y-b)*(p[i].y-b)<=r*r)//判断该点是否在圆内
cnt++;
}
if(cnt>0&&cnt<3)//圆内有顶点但不包括全部则必相交
printf("Yes\n");
else if(cnt==3||!check())//三角形全部在内部或者全部在外面无相交边
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
51Nod 1298 圆与三角形(计算几何)的更多相关文章
- 51nod 1298 圆与三角形——计算几何
题目链接:http://www.51nod.com/Challenge/Problem.html#!#problemId=1298 转化成判断三条线段和圆是否
- 51nod 1298 圆与三角形 (计算几何)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 求出圆心到三条线段的最短距离,然后判断是否有顶点在圆外,就把全部情 ...
- 51nod 1298:圆与三角形(计算几何)
题目链接 判断圆和三角形是否相交 可以转化为 判断三条线段是否和圆相交 #include<iostream> #include<cstdio> #include< ...
- 51nod 1298 圆与三角形
给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). 输入 第1行:一个数 ...
- (图论)51NOD 1298 圆与三角形
给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). 输入 第1行:一个数T, ...
- 51nod1298圆与三角形——(二分法)
1298 圆与三角形 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆同 ...
- (点到线段的最短距离)51nod1298 圆与三角形
1298 圆与三角形 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交.相交输出"Yes",否则输出"No".(三角形的面积大于0). 收起 ...
- 51nod1298 圆与三角形
1298 圆与三角形 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题 收藏 关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三 ...
- 51nod-1298 圆与三角形(计算几何超详解)
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1298 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是 ...
随机推荐
- list补充,append()、extend()、insert()、remove()、del()、pop()、分片
1.添加 append(object),是指在列表的末尾添加一个元素. >>> arr = [1,2,'a','你好',[11,22,33]] >>> arr [1 ...
- xadmin后台页面定制和添加服务器监控组件
xadmin定制 项目需要添加服务器监控页面,碍于xadmin不是很好自定义页面,之前写过插件,太麻烦了,还是直接改源码 原理其实很简单,因为xadmin的处理流程和django类似,都是通过拦截UR ...
- dubbo源码分析13——服务本地暴露 exportLocal(url)
dubbo服务的本地暴露,显然是针对当服务消费者和服务提供者都在同一个jvm的进程内这种场景 .通常是发生在服务之间的调用的情况下.一种情况就是A服务调用B服务的情况,如果A服务和B服务都是在一个线程 ...
- dubbo源码分析9——ServiceBean的afterPropertiesSet方法分析
ServiceBean的afterPropertiesSet方法是实现了InitializingBean,还是准备先做宏观分析,然后再做细致分析.下面先宏观分析: public void after ...
- MySQL主从复制报错1594处理【转】
一.问题描述 Mysql主从复制模式中,slave上报错 “relay log read failure”,导致主从同步停止. mysql> show slave status\G ****** ...
- Vue.js 子组件的异步加载及其生命周期控制
前端开发社区的繁荣,造就了很多优秀的基于 MVVM 设计模式的框架,而组件化开发思想也越来越深入人心.这其中不得不提到 Vue.js 这个专注于 VM 层的框架. 本文主要对 Vue.js 组件化开发 ...
- CDHtmlDialog探索----Javascript与窗体交互
CDHtmlDialog提供了C++与网页的双向交互,通此一系统简单的宏调用可以把网页中各元素的事件直接映射到C++程序中,而在网页中调用C++功能代码就显的不那么直观了.归根结底交互的基理就是实现相 ...
- 【转】vector中erase()的使用注意事项
vector::erase():从指定容器删除指定位置的元素或某段范围内的元素 vector::erase()方法有两种重载形式 如下: iterator erase( iterator _Whe ...
- gPRC学习笔记
gPRC学习笔记 gPRC基础教程. gPRC官方文档. protobuf 3.0的简易教程. 什么是RPC RPC(remote procedure call) -- 远程过程调用(相对于本地调用的 ...
- Zabbix3.2监控Windows的内存使用百分比并在内存使用率超过85%的时候触发报警
内存使用率key:vm.memory.size[pused]