博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
判断圆和矩形是否相交
阅读量:6500 次
发布时间:2019-06-24

本文共 2156 字,大约阅读时间需要 7 分钟。

#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://xcvyo.baihongyu.com/

你可能感兴趣的文章
linux 英语大全对照表,Linux下推荐的常用应用程序列表(国外英语).doc
查看>>
2018秋c语言程序设计考试答案,2018秋C语言程序设计上(赵三元)-中国大学mooc-题库零氪...
查看>>
c语言从文件读取矩阵做乘积,三阶矩阵的乘法(C语言从文件中读入)
查看>>
爱因斯坦阶梯问题用while循环c语言,【C语言编程练习】5.9 爱因斯坦的阶梯问题...
查看>>
c语言软件横8,经典C语言程序设计100例(8)
查看>>
c语言结构体初始化及赋值,结构体的定义、初始化和赋值
查看>>
C语言十六进制0-9转化位十进制,C语言编程 十六进制转化成十进制
查看>>
slip协议的实现 c语言,浅析PPP和SLIP协议
查看>>
大一c语言学霸笔记图片,点开这篇推文,你离学霸只差一个笔记的距离
查看>>
Android file 封装,Android Studio封装.so文件教程
查看>>
android 页面无法点击,为什么点击不跳转到下一界面,哪位大神帮瞅瞅
查看>>
android单位转换小程序,微信小程序中rpx与rem单位转换
查看>>
android phone win10下载,Win10 Your Phone新功能:PC端运行Android应用
查看>>
js android x5,腾讯x5开源库进行Js交互
查看>>
android开发中为视频添加暂停播放器,Android - 视频启动时暂停音乐播放器
查看>>
html绝对定位重叠,HTML_firefox下绝对定位元素重叠造成不可点击问题,重构地图网站过程中碰到的,f - phpStudy...
查看>>
ps切图教程 android,PS前端切图完整教程
查看>>
html显示服务器状态,显示服务器时间并一直显示(html代码)
查看>>
在线html代码优化,网站seo优化html代码方法
查看>>
html中嵌入flv视频直播,html中嵌入flv格式文件的代码
查看>>