zoukankan      html  css  js  c++  java
  • 51nod1298 圆与三角形

    题目来源: 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


    题意:中文题

    思路:判断三角形是否与圆内相交,逆向思维考虑三角形与圆不相交的情况:

    • 三角形在圆内
    • 三角形全部在圆外,此时考虑任意一条三角形的边与圆相交即可成立,否则不相交
    #include <iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    typedef long long ll;
    typedef struct
    {
       ll x,y;
    }point;
    point A,B,C,O;
    ll r;
    
    ll distance(point *p1,point *p2)//两点之间距离的平方
    {
        return (p1->x-p2->x)*(p1->x-p2->x)+(p1->y-p2->y)*(p1->y-p2->y);
    }
    
    int pan_duan(point *p1,point *p2)
    {
        ll a,b,c,dist1,dist2,angle1,angle2;//ax+by+c=0;
        if(p1->x==p2->x)
            a=1,b=0,c=-p1->x;//特殊情况判断,分母不能为零
        else if(p1->y==p2->y)
            a=0,b=1,c=-p1->y;//特殊情况判断,分母不能为零
        else
        {
            a=p1->y-p2->y;
            b=p2->x-p1->x;
            c=p1->x*p2->y-p1->y*p2->x;
        }
        dist1=a*O.x+b*O.y+c;
        dist1*=dist1;
        dist2=(a*a+b*b)*r*r;
        if(dist1>dist2)return 0;//点到直线距离大于半径
        angle1=(O.x-p1->x)*(p2->x-p1->x)+(O.y-p1->y)*(p2->y-p1->y);
        angle2=(O.x-p2->x)*(p1->x-p2->x)+(O.y-p2->y)*(p1->y-p2->y);
        if(angle1>0&&angle2>0)return 1;
        return 0;
    
    }
    
    //判断是否相交,相交返回1,不相交返回0
    int intersect()
    {
        ll distA=distance(&O,&A);//OA^2
        ll distB=distance(&O,&B);//OB^2
        ll distC=distance(&O,&C);//OC^2
        ll r2=r*r;
        if(distA<r2&&distB<r2&&distC<r2)//圆包含三角形
            return 0;
        else if(distA>r2&&distB>r2&&distC>r2)//三点都在圆外
        {
            return pan_duan(&A,&B)||pan_duan(&A,&C)||pan_duan(&B,&C);
    
        }
        return 1;
    }
    
    int main()
    {
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%lld%lld%lld%lld%lld%lld%lld%lld%lld",&O.x,&O.y,&r,&A.x,&A.y,&B.x,&B.y,&C.x,&C.y);
            printf("%s
    ",intersect()?"Yes":"No");
        }
    }
    
    
    
    






  • 相关阅读:
    Head first javascript(七)
    Python Fundamental for Django
    Head first javascript(六)
    Head first javascript(五)
    Head first javascript(四)
    Head first javascript(三)
    Head first javascript(二)
    Head first javascript(一)
    Sicily 1090. Highways 解题报告
    Python GUI programming(tkinter)
  • 原文地址:https://www.cnblogs.com/bryce1010/p/9387346.html
Copyright © 2011-2022 走看看