3 回答

TA貢獻2019條經驗 獲得超9個贊
要么圓心位于矩形內,要么 矩形的一個邊在圓中有一個點。
P
R
A
, B
, C
, D
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

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)); }
第一對直線計算圓心和矩形中心之間x和y差值的絕對值。這會將四個象限折疊成一個,這樣計算就不必再做四次了。這張圖顯示了圓心現在必須放置的區域。注意,只顯示了一個象限。矩形是灰色區域,紅色邊框勾勒出與矩形邊緣正好有一個半徑的臨界區域。圓的中心必須在這個紅色的邊界內,才能發生交點。 第二對線消除了簡單的情況,即圓離矩形足夠遠(在任一方向),不可能相交。這與圖像中的綠色區域相對應。 第三對線處理簡單的情況,即圓足夠接近矩形(在任一方向),以保證一個交點。這對應于圖像中的橙色和灰色部分。注意,這個步驟必須在步驟2之后完成,這樣邏輯才有意義。 其余的線計算出圓圈可能與矩形角相交的困難情況。若要求解,請計算從圓心到拐角的距離,然后驗證距離不大于圓的半徑。此計算對中心位于紅色陰影區域內的所有圓返回false,對于中心位于白陰影區域內的所有圓返回true。
添加回答
舉報