• 51nod1298 圆与三角形


    给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"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


    题目思路:有三种情况:
    1.三点全在圆内,一定不相交
    2.三点有点在圆内,有点在圆外,一定相交
    3.三点全在圆外,有可能相交,要判断圆心到边是否有垂线,有垂线且长度小于半径则在圆内

    代码:
    #include<iostream>
    #include<algorithm>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    using namespace std;
    struct point{
        double x,y;
    }o,a,b,c;
    double d(point a,point b)//两点距离的平方 
    {
        return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
    }
    int main()
    {
        int t;
        double r;
        cin>>t;
        while(t--)
        {
            int flag=0,flag1=0,flag2=0;
            cin>>o.x>>o.y>>r;
            cin>>a.x>>a.y;
            cin>>b.x>>b.y;
            cin>>c.x>>c.y;
            if(d(a,o)>=r*r||d(b,o)>=r*r||d(c,o)>=r*r)//点是否在圆外 
                flag1=1;
            if(d(a,o)<=r*r||d(b,o)<=r*r||d(c,o)<=r*r)//点是否在圆内 
                flag2=1;
            if(flag1&&flag2)//有点在圆内也有在圆外必定相交 
                flag=1;
            else if(flag1&&!flag2)//点全在员外 
            {
                double a1,b1,c1,ab,ac,bc,s;
                a1=d(a,o);
                b1=d(b,o);
                c1=d(c,o);
                ab=d(a,b);
                ac=d(a,c);
                bc=d(b,c);
                if(a1+ab>=b1&&b1+ab>=a1)//判断是否有垂线 
                {
                    s=ab*a1-((ab+a1-b1)/2*(ab+a1-b1)/2);//秦九韶公式 
                    if(sqrt(s/ab)<=r)
                        flag=1;
                }
                if(a1+ac>=c1&&c1+ac>=a1)
                {
                    s=ac*a1-((ac+a1-c1)/2*(ac+a1-c1)/2);
                    if(sqrt(s/ac)<=r)
                        flag=1;
                }
                if(b1+bc>=c1&&c1+bc>=b1)
                {
                    s=bc*b1-((bc+b1-c1)/2*(bc+b1-c1)/2);
                    if(sqrt(s/bc)<=r)
                        flag=1;
                }
            }
            if(flag)
                cout<<"Yes"<<endl;
            else
                cout<<"No"<<endl;
        }
        return 0;
    }
     
  • 相关阅读:
    Android对话框自定义标题
    JSONObject和JSONArray的关系
    Java的List排序
    重写onStart()函数
    SSH框架执行自己定义的SQL语句
    nested exception is org.hibernate.QueryException: could not resolve property
    java.lang.NullPointerException org.apache.struts2.impl.StrutsActionProxy.getErrorMessage(StrutsActionProxy.java:69)
    Java项目打包部署war文件
    一道腾讯面试题
    SSH服务器与Android通信(3)--Android客户端发送数据
  • 原文地址:https://www.cnblogs.com/xiongtao/p/9366397.html
Copyright © 2020-2023  润新知