您的位置:首页 > 其它

51Nod 1298 圆与三角形

2017-12-06 16:42 375 查看
给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出”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

计算几何模板真难打啊!

cin还卡了一组样例的时间

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-8
#define IO ios::sync_with_stdio(false);\
cin.tie(0);\
cout.tie(0);
using namespace std;
struct point
{
double x,y;
};
typedef struct point point;
double xmult(point p1,point p2,point p0)
{
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
double dis(point p1,point p2)
{
return sqrt((p1.x-p2.x)*(p1.x-p2.x)+(p1.y-p2.y)*(p1.y-p2.y));
}
double disptoline(point p,point l1,point l2)
{
return fabs(xmult(p,l1,l2)/dis(l1,l2));
}
int intersect_seg_cricle(point c,double r,point l1,point l2)
{
double t1=dis(c,l1)-r,t2=dis(c,l2)-r;
point t=c;
if(t1<eps||t2<eps)
return t1>-eps||t2>-eps;
t.x+=l1.y-l2.y;
t.y+=l2.x-l1.x;
return xmult(l1,c,t)*xmult(l2,c,t)<eps&&disptoline(c,l1,l2)-r<eps;
}
int main()
{
IO;
int T;
cin>>T;
while(T--)
{
double r;
point p,p1,p2,p3;
cin>>p.x>>p.y>>r;
cin>>p1.x>>p1.y;
cin>>p2.x>>p2.y;
cin>>p3.x>>p3.y;
int flag1=intersect_seg_cricle(p,r,p1,p2);
int flag2=intersect_seg_cricle(p,r,p2,p3);
int flag3=intersect_seg_cricle(p,r,p1,p3);
if(flag1||flag2||flag3)
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: