51NOD 1298 圆与三角形
2017-03-30 16:01
267 查看
1298 圆与三角形
题目来源: HackerRank
基准时间限制: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.圆心到直线距离小于或等于半径
- 两个点都在圆内//不相交
- 一点圆内一点圆外//必定相交
- 两点都在圆外//用到了余弦定理判断角度 都是锐角的情况下 线段与圆相交
题目来源: HackerRank
基准时间限制: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.圆心到直线距离小于或等于半径
- 两个点都在圆内//不相交
- 一点圆内一点圆外//必定相交
- 两点都在圆外//用到了余弦定理判断角度 都是锐角的情况下 线段与圆相交
#include<iostream> #include<stdio.h> #include<algorithm> #include<cmath> using namespace std; int x[3]; int y[3]; int a,b,r; int flag; int c[3]; int check(int s,int e) { double x1=x[s],y1=y[s]; double x2=x[e],y2=y[e]; double A,B,C;//直线的一般式 if(x1==x2) { A=1; B=0; C=-x1; } else if(y1==y2) { A=0; B=1; C=-y1; } else { A=y2-y1; B=-x2+x1; C=-x1*y2+x2*y1; } double d; double l1,l2,l3; l1=sqrt((x1-a)*(x1-a)+(y1-b)*(y1-b)); l2=sqrt((x2-a)*(x2-a)+(y2-b)*(y2-b)); d=fabs((A*a+B*b+C)/(sqrt(A*A+B*B)));//圆心到直线距离 if(d>r)//圆心到直线距离大于半径 { return 0;//不相交 } else//圆心到直线距离小于或等于半径 { if(l1>r&&l2>r) { int ag1=(a-x1)*(x2-x1)+(b-y1)*(y2-y1); int ag2=(a-x2)*(x1-x2)+(b-y2)*(y1-y2); if(ag1>0&&ag2>0) { return 1;//余弦定理 都是锐角 必定相交 } else { return 0; } } else if(l1<r&&l2<r) { return 0; } else { return 1; } } } int main() { freopen("e:/r.txt","r",stdin); int t; cin>>t; while(t--) { flag=0; cin>>a>>b>>r; for(int i=0;i<3;++i) { cin>>x[i]>>y[i]; } c[0]=check(0,1); c[1]=check(1,2); c[2]=check(0,2); for(int i=0;i<3;++i) { if(c[i]==1) { flag=1; break; } } if(flag) { cout<<"Yes"<<endl; } else { cout<<"No"<<endl; } } return 0; }
相关文章推荐
- 51nod 1298:圆与三角形(计算几何)
- [51nod]1298 圆与三角形
- 51nod 1298 圆与三角形
- 51Nod 1298 圆与三角形 计算几何
- [51nod]1298 圆与三角形
- 【51Nod】1298 - 圆与三角形(计算几何)
- 51nod 1298 圆与三角形
- 51nod 1298 圆与三角形
- 51Nod 1298 圆与三角形
- 51Nod 1298 圆与三角形
- 51nod 1298 圆与三角形(基础题,计算几何)
- 51Nod-1298 圆与三角形
- 51Nod 1298 圆与三角形 (计算几何)
- 51nod 1298 圆与三角形
- 51nod 1298 圆与三角形 (计算几何)
- 圆与三角形-51NOD 1298
- 51nod 1298 圆与三角形
- 51Nod 1298 圆与三角形
- 51Nod 1298 圆与三角形
- 51nod--1298 圆与三角形