第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
完全的数学问题,考虑点和线段的最长距离和最短距离。直线方程要分情况考虑,将斜率为0的直线和斜率不存在的直线以及普通直线分开考虑。
#include
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(ax[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(by[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(( ux[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