检查另一个圆圈中是否包含圆圈

时间:2015-11-03 02:13:52

标签: class python-3.x methods geometry

我正在尝试检查另一个圈子中是否包含圆圈。我不确定它背后的数学是问题还是我的if语句,因为我不断得到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

4 个答案:

答案 0 :(得分:23)

我不知道python但数学很简单。见下图

enter image description here

检查圆圈1内的圆圈2,

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

答案 1 :(得分:2)

您拥有distance_2 = distance + circle.get_radius(),因此distance_2始终高于distancedistance_2 > distance始终为真。

答案 2 :(得分: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())

顺便说一句,就像样式注释一样,不需要在Python中编写getter和setter。您可以只有字段,如果需要修改它们的访问方式,可以稍后覆盖它(不影响任何访问它们的类)。

从最早的版本(甚至可能从一开始)轻松实现这一点是Python如此吸引人并且设法起飞的原因之一。因此,Python代码往往很短。因此,你不会忘记森林的树木。

答案 3 :(得分:0)

根据接受的答案中的图像的代码(无需吸气剂,因为它更具可读性):

import math
def contains(self, circle):
  d = math.sqrt(
        (circle.center[0] - self.center[0]) ** 2 +
        (circle.center[1] - self.center[1]) ** 2)
  return self.radius  > (d + circle.radius)

我使用了它,并且它起作用了。在下面的图中,您可以看到红色的大圆中的完全被涂成绿色,而其他的涂成黑色:

enter image description here