判断圆和矩形是否相交

简介:
#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 ;
}              本文转自莫水千流博客园博客,原文链接:http://www.cnblogs.com/zhoug2020/p/5061564.html,如需转载请自行联系原作者
相关文章
|
算法 前端开发
圆和矩形是否有重叠
圆和矩形是否有重叠
89 0
|
4月前
|
算法 C++
平面中判断线段与矩形是否相交
平面中判断线段与矩形是否相交
64 0
|
7月前
leetcode-1725:可以形成最大正方形的矩形数目
leetcode-1725:可以形成最大正方形的矩形数目
40 0
三角形判断
三角形判断
84 0
判断线段是否相交
判断线段是否相交
90 0
判断点是否在线段上
判断点是否在线段上
157 0
给定三个顶点的坐标使用程序计算三角形
给定三个顶点的坐标使用程序计算三角形
72 0
给定圆的半径r,求圆的面积。
给定圆的半径r,求圆的面积。
136 0
16:三角形判断
16:三角形判断
115 0
140.递归法绘制三角形图案
140.递归法绘制三角形图案
88 0