您的位置:首页 > 其它

51Nod 1298 圆与三角形 计算几何

2018-01-30 10:29 239 查看
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


这种题是最考验心态的,并不难但需要冷静的思考和分析。

完全的数学问题,考虑点和线段的最长距离和最短距离。直线方程要分情况考虑,将斜率为0的直线和斜率不存在的直线以及普通直线分开考虑。

#include<bits/stdc++.h>
using namespace std;
double a,b,r;
double x[3],y[3];
struct Line
{
double lmax,lmin;
};
Line judge(double k,double t,int i,int j)
{
Line e;
if(y[i]-y[j]==0||x[i]-x[j]==0)
{
if(y[i]-y[j]==0)
{
double u,v,A,B;
u=min(x[i],x[j]);
v=max(x[i],x[j]);
A=(a-u)*(a-u)+(b-y[i])*(b-y[i]);
B=(a-v)*(a-v)+(b-y[i])*(b-y[i]);
if(a<x[i]&&a<x[j]||a>x[i]&&a>x[j])
{
e.lmax=max(A,B);
e.lmin=min(A,B);
return e;
}
else
{
e.lmax=max(A,B);
e.lmin=(y[i]-b)*(y[i]-b);
return e;
}
}
if(x[i]-x[j]==0)
{
double u,v,A,B;
u=min(y[i],y[j]);
v=max(y[i],y[j]);
A=(a-x[i])*(a-x[i])+(b-u)*(b-u);
B=(a-x[i])*(a-x[i])+(b-v)*(b-v);
if(b<y[i]&&b<y[j]||b>y[i]&&b>y[j])
{
e.lmax=max(A,B);
e.lmin=min(A,B);
return e;
}
else
{
e.lmax=max(A,B);
e.lmin=(x[i]-a)*(x[i]-a);
return e;
}
}
}
else
{
double u=(k*x[i]-y[i]-t*a+b)/(k-t);
double v=k*u-k*x[i]+y[i];
// printf("%f ,%f\n",u,v);
double A,B;
A=(a-x[i])*(a-x[i])+(b-y[i])*(b-y[i]);
B=(a-x[j])*(a-x[j])+(b-y[j])*(b-y[j]);
if(( u<x[i] && u<x[j] ) || ( u>x[i] && u>x[j] ))
{
e.lmax=max(A,B);
e.lmin=min(A,B);
return e;
}
else
{
double C;
C=(u-a)*(u-a)+(v-b)*(v-b);
e.lmin=C;
e.lmax=max(A,B);
return e;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%lf%lf%lf",&a,&b,&r);
scanf("%lf%lf",&x[0],&y[0]);
scanf("%lf%lf",&x[1],&y[1]);
scanf("%lf%lf",&x[2],&y[2]);
r=r*r;

double k[3],t[3];
k[0]=(y[0]-y[1])/(x[0]-x[1]);
k[1]=(y[1]-y[2])/(x[1]-x[2]);
k[2]=(y[0]-y[2])/(x[0]-x[2]);
//printf("%f %f %f\n",k[0],k[1],k[2]);

t[0]=-1/k[0];
t[1]=-1/k[1];
t[2]=-1/k[2];

Line l1,l2,l3;
l1=judge(k[0],t[0],0,1);
l2=judge(k[1],t[1],1,2);
l3=judge(k[2],t[2],0,2);
//printf("l1=%f l2=%f l3=%f\n",l1,l2,l3);
if( l1.lmax>r&&l2.lmax>r&&l3.lmax>r&&l1.lmin>r&&l2.lmin>r&&l3.lmin>r ||
l1.lmax<r&&l2.lmax<r&&l3.lmax<r&&l1.lmin<r&&l2.lmin<r&&l3.lmin<r )
printf("No\n");
else
printf("Yes\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: