2015-11-03 186 views
0

我正在嘗試檢查圓圈是否包含在另一個圓圈內。我不確定它背後的數學問題是否是問題,或者它是否屬於我的陳述,因爲我通過任何事情都會收到True檢查另一個圓圈是否包含圓圈

#Get_center returns (x,y) 
#Get_radius returns radius length 
def contains(self,circle): 
    distance = round(math.sqrt((circle.get_center()[0]-self.get_center()[0])**2 + (circle.get_center()[1] - self.get_center()[1])**2)) 
    distance_2 = distance + circle.get_radius() 
    if distance_2 > distance: 
     return True  #Circle 2 is contained within circle 1 
+0

你的意思是徹底包含嗎?還是部分? – CroCo

+0

@CroCo整個圓圈必須被包含 –

+0

你不覺得自我半徑應該進入計算嗎? – agentp

回答

9

我不知道python,但數學很簡單。見下面的圖片

enter image description here

要檢查是否圈2的內側圈1,

compute d 
    d = sqrt((x2-x1)^2 + (y2-y1)^2); 
get c2 and c1 
if c1 > (d + c2) 
    circle 2 inside circle 1 
else 
    circle 2 not inside circle 1 
+0

不錯的圖片,讓回答顯而易見。 –

+0

圖片真的很明顯,非常感謝! –

2

你有distance_2 = distance + circle.get_radius(),所以distance_2總是會高於distancedistance_2 > distance永遠是正確的。

1

如果你想嚴格的遏制,這意味着半徑之差的絕對值將小於中心之間的距離。你可以利用這一點,以避免採取平方根(因爲兩個正數的平方將有相同的順序號本身):

def contains(self,circle): 
    distance_squared = (circle.get_center()[0]-self.get_center()[0])**2 + (circle.get_center()[1] - self.get_center()[1])**2 
    difference_squared = (self.get_radius() - circle.get_radius())**2 
    return (difference_squared < distance_squared) and (self.get_radius() > circle.get_radius()) 

順便說一句,只是作爲一個樣式注意,沒有必要寫getter和setter在Python中。你可以只有字段,如果你需要修改它們的訪問方式,你可以稍後重寫它(不影響任何訪問它們的類)。

從最早的版本(甚至可能從一開始)就可以輕鬆實現這一點,這也是Python如此吸引人並且設法起飛的原因之一。由於這個原因,Python代碼往往非常短。所以你不會忽略樹木的森林。