天天看點

平面矩形與圓相交(重疊)的判斷

在平面上判斷一個圓形與矩形相交(重疊)!

今天突然遇到要判斷圓形與矩形相交的問題!在網上搜尋了一下,看看有沒有好的方法!發現讨論這個的比較少,以前有一個

文章倒是讨論過,但是文章上好像沒讨論出什麼東西,最後就不了了之了!

後來想了一下,我用下面的方法解決的,感覺還行!雖然方法不難,貼出來做個筆記!

假設

矩形中心為 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) )

{

    // 矩形與圓相交

}

綜上:

上述任何一個判斷成立,那麼矩形與圓相交,否則矩形與圓不相交。