我正在尝试检查另一个圈子中是否包含圆圈。我不确定它背后的数学是问题还是我的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
答案 0 :(得分:23)
我不知道python但数学很简单。见下图
检查圆圈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
始终高于distance
,distance_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)