在平面上判断一个圆形与矩形相交(重叠)!
今天突然遇到要判断圆形与矩形相交的问题!在网上搜索了一下,看看有没有好的方法!发现讨论这个的比较少,以前有一个
帖子倒是讨论过,但是帖子上好像没讨论出什么东西,最后就不了了之了!
后来想了一下,我用下面的方法解决的,感觉还行!虽然方法不难,贴出来做个笔记!
假设
矩形中心为 p(rec_x,rec_y),矩形的宽和高分别是 rec_width, rec_high.
圆形的中心为p(cir_x, cir_y), 圆形的半径为 cir_size.
判断的时候,
可以先判断 矩形的四个角是否在圆形当中,相当于判断圆心位于矩形左上角,右上角,右下角,左下角四个区域时,的相交情况。
还有一种情况是圆心到矩形的边的距离比圆心到矩形的四个角距离近,这时候要另外判断圆形是否与矩形的边相交,或者在矩形内部。
此时,相当于判断圆心位于矩形的上,下左,右以及位于矩形内部是的相交情况。
第一种情况:
x = min( abs( rec_x + rec_width / 2 - cir_x), abs (rec_x - rec_width / 2 - cir_x ) ); // 矩形四个角中,离圆心近的角,到圆心的x距离
y = min( abs(rec_y + rec_high / 2 - cir_y), abs(rec_y - rec_high / 2 - cir_y ) ); // 矩形四个角中,离圆心近的角,到圆心的y距离
if (x * x + y * y < cir_size * cir_size * 4)
{
// 矩形与圆相交
}
第二种情况:
先判断圆形与左右两条边相交,或者在矩形里面
if ( abs(rec_x - cir_x) < ((rec_width + cir_size) / 2) ) && abs(rec_y - cir_y) < (rec_high / 2) )
{
// 矩形与圆相交
}
然后判断圆形与上下两条边相交时:
if (abs(rec_y - cir_y ) < ((rec_high + cir_size) / 2 ) && abs(rec_x - cir_x) < (rec_width / 2) )
{
// 矩形与圆相交
}
综上:
上述任何一个判断成立,那么矩形与圆相交,否则矩形与圆不相交。