亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

圓-矩形碰撞檢測(相交)

圓-矩形碰撞檢測(相交)

圓-矩形碰撞檢測(相交)如何判斷二維歐幾里德空間中的圓與矩形是否相交?(即經典的二維幾何)
查看完整描述

3 回答

?
慕少森

TA貢獻2019條經驗 獲得超9個贊

當圓與矩形相交時,只有兩種情況:

  • 要么圓心位于矩形內,要么
  • 矩形的一個邊在圓中有一個點。

請注意,這并不要求矩形是軸平行的。

https://img1.sycdn.imooc.com//5d09a0fc00011ad111490775.jpg

(一種觀察方法是:如果圓中沒有一個點(如果所有的邊都“在”圓之外),那么圓仍然可以與多邊形相交的唯一方法是它完全位于多邊形內。)

有了這個洞察力,下面這樣的東西就能工作了,在那里圓圈有中心。P半徑R,而矩形具有頂點。ABCD按照這個順序(不完整的代碼):

def intersect(Circle(P, R), Rectangle(A, B, C, D)):
    S = Circle(P, R)
    return (pointInRectangle(P, Rectangle(A, B, C, D)) or
            intersectCircle(S, (A, B)) or
            intersectCircle(S, (B, C)) or
            intersectCircle(S, (C, D)) or
            intersectCircle(S, (D, A)))

如果您正在編寫任何幾何學,您可能已經在您的庫中具有上述功能。否則,pointInRectangle()可以通過多種方式實現;多邊形點方法可以工作,但對于矩形,只需檢查此方法是否有效:

0 ≤ AP·AB ≤ AB·AB and 0 ≤ AP·AD ≤ AD·AD

intersectCircle()也很容易實現:一種方法是檢查垂直于P到行足夠近,并且在端點之間,否則檢查終結點。

最酷的是IDEA不僅適用于矩形,而且適用于圓與任意一個圓的交點。簡單多邊形-甚至不一定是凸的!


查看完整回答
反對 回復 2019-06-19
?
蝴蝶刀刀

TA貢獻1801條經驗 獲得超8個贊

我會這樣做:

bool intersects(CircleType circle, RectType rect)
{
    circleDistance.x = abs(circle.x - rect.x);
    circleDistance.y = abs(circle.y - rect.y);

    if (circleDistance.x > (rect.width/2 + circle.r)) { return false; }
    if (circleDistance.y > (rect.height/2 + circle.r)) { return false; }

    if (circleDistance.x <= (rect.width/2)) { return true; } 
    if (circleDistance.y <= (rect.height/2)) { return true; }

    cornerDistance_sq = (circleDistance.x - rect.width/2)^2 +
                         (circleDistance.y - rect.height/2)^2;

    return (cornerDistance_sq <= (circle.r^2));
}

下面是它的工作原理:

https://img1.sycdn.imooc.com//5d09a10a0001353603300353.jpg

  1. 第一對直線計算圓心和矩形中心之間x和y差值的絕對值。這會將四個象限折疊成一個,這樣計算就不必再做四次了。這張圖顯示了圓心現在必須放置的區域。注意,只顯示了一個象限。矩形是灰色區域,紅色邊框勾勒出與矩形邊緣正好有一個半徑的臨界區域。圓的中心必須在這個紅色的邊界內,才能發生交點。

  2. 第二對線消除了簡單的情況,即圓離矩形足夠遠(在任一方向),不可能相交。這與圖像中的綠色區域相對應。

  3. 第三對線處理簡單的情況,即圓足夠接近矩形(在任一方向),以保證一個交點。這對應于圖像中的橙色和灰色部分。注意,這個步驟必須在步驟2之后完成,這樣邏輯才有意義。

  4. 其余的線計算出圓圈可能與矩形角相交的困難情況。若要求解,請計算從圓心到拐角的距離,然后驗證距離不大于圓的半徑。此計算對中心位于紅色陰影區域內的所有圓返回false,對于中心位于白陰影區域內的所有圓返回true。


查看完整回答
反對 回復 2019-06-19
  • 3 回答
  • 0 關注
  • 1799 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號