• 判断圆和矩形是否相交


    #include <iostream>
    #include
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    using namespace std;
     
    const double eps = 1e-8;
    const double pi = acos(-1);
     
    struct POINT
    {
        double x, y;
        POINT(double a, double b){
            x = a;
            y = b;
        }
        POINT() {}
    };
     
    struct Seg
    {
        POINT a, b;
        Seg() {}
        Seg(POINT x, POINT y){
            a = x;
            b =y;
        }
    };
     
    struct Line
    {
        POINT a, b;
        Line() {}
        Line(POINT x, POINT y){
            a = x;
            b = y;
        }
    };
     
    struct Cir
    {
        POINT o;
        double r;
        Cir() {}
        Cir(POINT oo, double rr){
            o = oo;
            r = rr;
        }
    };
     
    struct Rec
    {
        POINT p1, p2, p3, p4;
        Rec() { }
        Rec(POINT a, POINT b, POINT c, POINT d){
            p1 = a;
            p2 = b;
            p3 = c;
            p4 = d;
        }
    };
     
    int dcmp(double x)
    {
        if(fabs(x) < eps) return 0;
        else return x < 0 ? -1 : 1;
    }
     
    double x, y, r;
    double x1, yy1, x2, y2;
     
    double cross(POINT o, POINT a, POINT b)
    {
        return (a.x - o.x) * (b.y - o.y) - (b.x - o.x) * (a.y - o.y);
    }
     
    double dis(POINT a, POINT b)
    {
        return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
    }
     
    double PointToLine(POINT p, Line l)
    {
        return fabs(cross(p, l.a, l.b)) / dis(l.a, l.b);
    }
     
    double PointToSeg(POINT p, Seg s)
    {
        POINT tmp = p;
        tmp.x += s.a.y - s.b.y;
        tmp.y += s.b.x - s.a.x;
        if(cross(s.a, p, tmp) * cross(s.b, p, tmp) >= eps){
            return min(dis(p, s.a), dis(p, s.b));
        }
        return PointToLine(p, Line(s.a, s.b));
    }
     
    //
    bool Circle_Rectangle_cross(Cir O, Rec R)
    {
        if(dcmp(dis(O.o, R.p1) - O.r) < 0 && dcmp(dis(O.o, R.p2) - O.r) < 0 && dcmp(dis(O.o, R.p3) - O.r) < 0 && dcmp(dis(O.o, R.p4) - O.r) < 0)
            return false;
        if(dcmp(PointToSeg(O.o, Seg(R.p1, R.p2)) - O.r) <= 0) return true;
        if(dcmp(PointToSeg(O.o, Seg(R.p2, R.p3)) - O.r) <= 0) return true;
        if(dcmp(PointToSeg(O.o, Seg(R.p3, R.p4)) - O.r) <= 0) return true;
        if(dcmp(PointToSeg(O.o, Seg(R.p4, R.p1)) - O.r) <= 0) return true;
        return false;
    }
     
    int main()
    {
    //    freopen("1.txt", "r", stdin);
    //    freopen("2.txt", "w", stdout);
        int T;
        scanf("%d", &T);
        while(T -- ){
            Cir O;
            Rec R;
            scanf("%lf %lf %lf", &O.o.x, &O.o.y, &O.r);
            scanf("%lf %lf %lf %lf", &R.p1.x, &R.p1.y, &R.p2.x, &R.p2.y);
            scanf("%lf %lf %lf %lf", &R.p3.x, &R.p3.y, &R.p4.x, &R.p4.y);
            if(Circle_Rectangle_cross(O, R)) puts("Yes!");
            else puts("No!");
        }
        return 0;
    }
  • 相关阅读:
    Sqlite数据库的加密
    利用Cache缓存数据DataTable数据提高大数据量访问性能
    MYSQL数据库主主同步实战
    【误人子弟】《ASP.NET常用语句120条,(很实用的)
    Debian 添加 FreeBSD 内核支持
    FIREBIRD的基本数据类型
    扩大Portable Ubuntu的系统可用空间
    SQL语句 按年龄段分组统计人数问题
    aspx 页面,master页面与ascx用户控件传值的问题
    MonoDevelop 2.0 Released 发布
  • 原文地址:https://www.cnblogs.com/zhoug2020/p/5061564.html
Copyright © 2020-2023  润新知