1298 圆与三角形
给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"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思路:这个题是要分类讨论,先判断三角形的三个顶点的位置,如果三个顶点都在圆内,那么三角形一定与圆不想交,如果三个顶点都在圆外,那这个需要看情况讨论,详情见往后,其他的都可以认为与圆相交。在三个顶点都在圆外的情况上,可以通过圆心到三角形的三个边的距离来判断,如果其中一个距离小于圆的半径,那么可以认为三角形与圆相交。其中,需要注意的是:
这个距离是指的是点到线段的距离,而不是点到直线的距离!!!!!!
关于点到线段距离的参考链接:https://blog.csdn.net/betwater/article/details/52434017C++代码:
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
struct Triangle{
double x,y;
}tri[3];
double dis(
double cx,
double cy,Triangle a,Triangle b){
double k1 = (a.x - cx)*(a.x - b.x) + (a.y - cy)*(a.y -
b.y);
if(k1 <=
0){
return sqrt((a.x - cx)*(a.x - cx) + (a.y - cy)*(a.y -
cy));
}
double k2 = (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y -
b.y);
if(k1 >=
k2){
return sqrt((b.x - cx)*(b.x - cx) + (b.y - cy)*(b.y -
cy));
}
double r = k1/
k2;
double px = a.x + (b.x - a.x)*
r;
double py = a.y + (b.y - a.y)*
r;
return sqrt((cx - px)*(cx - px) + (cy - py)*(cy -
py));
}
bool rr(
double cx,
double cy,
double r,Triangle a,Triangle b){
double t =
dis(cx,cy,a,b);
if(t <=
r){
return true;
}
else{
return false;
}
}
bool cmp(
double cx,
double cy,
double r,Triangle a,Triangle b,Triangle c){
double k1 = (a.x - cx)*(a.x - cx) + (a.y - cy)*(a.y - cy) - r*
r;
double k2 = (b.x - cx)*(b.x - cx) + (b.y - cy)*(b.y - cy) - r*
r;
double k3 = (c.x - cx)*(c.x - cx) + (c.y - cy)*(c.y - cy) - r*
r;
if(k1<
0 && k2<
0 && k3<
0)
return false;
else if(k1>
0 && k2>
0 && k3>
0){
if(rr(cx,cy,r,a,b) || rr(cx,cy,r,a,c) ||
rr(cx,cy,r,b,c)){
return true;
}
else{
return false;
}
}
else
return true;
}
int main(){
int T;
scanf("%d",&
T);
double cx,cy,r;
while(T--
){
cin>>cx>>cy>>
r;
for(
int i =
0; i <
3; i++
){
cin>>tri[i].x>>
tri[i].y;
}
if(cmp(cx,cy,r,tri[
0],tri[
1],tri[
2])){
printf("Yes\n");
}
else
printf("No\n");
}
return 0;
}
转载于:https://www.cnblogs.com/Weixu-Liu/p/10602737.html