【问题标题】:Check if a circle is contained in another circle检查一个圈子是否包含在另一个圈子中
【发布时间】:2016-02-03 02:05:11
【问题描述】:

我正在尝试检查一个圈子是否包含在另一个圈子中。我不确定它背后的数学是否是问题,或者它是否是我的 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

【问题讨论】:

  • 你的意思是彻底遏制?还是部分?
  • @CroCo 整个圈子都必须被遏制
  • 你不认为自己的半径应该进入计算吗?
  • 关于圆圈的任何假设??
  • @CroCo 你所说的假设是什么意思?

标签: class python-3.x methods geometry


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    我不知道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
    

    【讨论】:

    • 图片不错,答案很明显。
    • 好答案,只是说你可以在没有 sqrt 的情况下做到这一点:( (x2-x1)^2 + (y2-y1)^2 ) > ( d + c2 )^2
    【解决方案3】:

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

    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 代码往往很短。因此,您不会只见树木不见森林。

    【讨论】:

      【解决方案4】:

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

      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)
      

      我用过,效果很好。在下图中,您可以看到红色大圆圈中的圆圈完全是如何涂成绿色的,而其他圆圈则涂成黑色:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-13
        • 2011-03-10
        • 2023-03-31
        • 1970-01-01
        相关资源
        最近更新 更多