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

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
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

你可能感兴趣的:(日常)