• (点到线段的最短距离)51nod1298 圆与三角形


    1298 圆与三角形

    给出圆的圆心和半径,以及三角形的三个顶点,问圆同三角形是否相交。相交输出"Yes",否则输出"No"。(三角形的面积大于0)。
     
     

    输入

    第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

    思路:这个题是要分类讨论,先判断三角形的三个顶点的位置,如果三个顶点都在圆内,那么三角形一定与圆不想交,如果三个顶点都在圆外,那这个需要看情况讨论,详情见往后,其他的都可以认为与圆相交。
    在三个顶点都在圆外的情况上,可以通过圆心到三角形的三个边的距离来判断,如果其中一个距离小于圆的半径,那么可以认为三角形与圆相交。
    其中,需要注意的是:
    这个距离是指的是点到线段的距离,而不是点到直线的距离!!!!!!
    关于点到线段距离的参考链接:https://blog.csdn.net/betwater/article/details/52434017

    C++代码:
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    using namespace std;
    struct Triangle{
        double x,y;
    }tri[3];
    double dis(double cx,double cy,Triangle a,Triangle b){
        double k1 = (a.x - cx)*(a.x - b.x) + (a.y - cy)*(a.y - b.y);
        if(k1 <= 0){
            return sqrt((a.x - cx)*(a.x - cx) + (a.y - cy)*(a.y - cy));
        }
        double k2 = (a.x - b.x)*(a.x - b.x) + (a.y - b.y)*(a.y - b.y);
        if(k1 >= k2){
            return sqrt((b.x - cx)*(b.x - cx) + (b.y - cy)*(b.y - cy));
        }
        double r = k1/k2;
        double px = a.x + (b.x - a.x)*r;
        double py = a.y + (b.y - a.y)*r;
        return sqrt((cx - px)*(cx - px) + (cy - py)*(cy - py));
    }
    bool rr(double cx,double cy,double r,Triangle a,Triangle b){
        double t = dis(cx,cy,a,b);
        if(t <= r){
            return true;
        }
        else{
            return false;
        }
    }
    bool cmp(double cx,double cy,double r,Triangle a,Triangle b,Triangle c){
        double k1 = (a.x - cx)*(a.x - cx) + (a.y - cy)*(a.y - cy) - r*r;
        double k2 = (b.x - cx)*(b.x - cx) + (b.y - cy)*(b.y - cy) - r*r;
        double k3 = (c.x - cx)*(c.x - cx) + (c.y - cy)*(c.y - cy) - r*r;
        if(k1<0 && k2<0 && k3<0)
            return false;
        else if(k1>0 && k2>0 && k3>0){
            if(rr(cx,cy,r,a,b) || rr(cx,cy,r,a,c) || rr(cx,cy,r,b,c)){
                return true;
            }
            else{
                return false;
            }
        }
        else
            return true;
    }
    int main(){
        int T;
        scanf("%d",&T);
        double cx,cy,r;
        while(T--){
            cin>>cx>>cy>>r;
            for(int i = 0; i < 3; i++){
                cin>>tri[i].x>>tri[i].y;
            }
            if(cmp(cx,cy,r,tri[0],tri[1],tri[2])){
                printf("Yes
    ");
            }
            else
                printf("No
    ");
        }
        return 0;
    } 
     
  • 相关阅读:
    css 三种布局定位
    居中布局注意的要点
    CSS盒子3D模型
    SpringMVC中JSP取不到ModelAndView的数据原因
    如何让 height:100%; 起作用
    css形变
    消除html元素之间空白
    h5移动端网页头部标签模板
    大数据之Hadoop核心之HDFS
    大数据之Hadoop集群搭建
  • 原文地址:https://www.cnblogs.com/Weixu-Liu/p/10602737.html
Copyright © 2020-2023  润新知