Class 检查一个圆是否包含在另一个圆中

Class 检查一个圆是否包含在另一个圆中,class,python-3.x,methods,geometry,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()[

我试图检查一个圆是否包含在另一个圆中。我不确定它背后的数学是问题还是我的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

你有
distance\u 2=distance+circle.get\u radius()
,因此
distance\u 2
将始终高于
distance
distance\u 2>distance
将始终为真。

我不懂python,但数学很简单。见下图

要检查圆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

如果你想要严格的包容,这意味着半径差的绝对值将小于中心之间的距离。您可以利用这一点来避免平方根(因为两个正数的平方与数字本身的顺序相同):

def包含(自身、圆圈):
距离平方=(圆。获取中心()[0]-self。获取中心()[0])**2+(圆。获取中心()[1]-self。获取中心()[1])**2
差分_平方=(self.get_radius()-circle.get_radius())**2
返回(差_平方<距离_平方)和(self.get_radius()>circle.get_radius())
顺便说一句,作为一种风格说明,不需要用Python编写getter和setter。您可以只使用字段,如果您需要修改它们的访问方式,您可以稍后重写它(而不影响访问它们的任何类)


从最早的版本(甚至可能从一开始)就简化了这一点,这是Python如此吸引人并得以成功发展的原因之一。正因为如此,Python代码往往非常简短。因此,您不会因为树木而忽略森林。

根据接受答案中的图像编码(不带getter,因为它更具可读性):

导入数学
def包含(自身、圆圈):
d=math.sqrt(
(圆心[0]-自圆心[0])**2+
(圆心[1]-自圆心[1])**2)
返回自半径>(d+圆半径)
我用过它,它很管用。在下图中,您可以看到完全包含在红色大圆圈中的圆圈是如何被画成绿色的,而其他圆圈是如何被画成黑色的:


你的意思是彻底控制?或者部分?@CroCo整个圆都必须包含在内,你不认为计算中应该包含自半径吗?关于圆的任何假设???@CroCo你所说的假设是什么意思?很好的图片,让答案很明显。很好的答案,只需说你可以不用sqrt来计算:((x2-x1)^2+(y2-y1)^2)>(d+c2)^2
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())