【问题标题】:How to tell if a circle and a square overlap at all when their centers are aligned当圆心对齐时,如何判断圆和正方形是否完全重叠
【发布时间】:2026-02-09 23:55:02
【问题描述】:

我不一定是在寻找解决这个问题的代码,而是更多地寻找如何找出它背后的逻辑。

我正在为我正在参加的计算机科学课做一个家庭作业问题,其中一个问题是,“方法 isUntangled 接受两个参数:圆的直径和正方形的边长,都是 double 类型。它返回当且仅当圆和正方形的中心对齐时不相交时才为真"

这是帮助理解的图片: Image

如果直径小于正方形边长,我尝试简单地返回 True,如果正方形的边长小于圆的直径,则返回 True。现在回想起来,我明白为什么它不起作用了。

我更想知道是否有人可以解释可用于解决此问题的逻辑/数学。

谢谢

【问题讨论】:

    标签: java math geometry


    【解决方案1】:

    有两种理解逻辑的方法

    1. 中方形弹性圆

    • 假设有一个中等大小的正方形,其中心是非常小的圆形。
    • 增加圆的直径并检查所有情况。
        1. 首先在正方形内完全圈出。
        1. 直径和边长相同时,在中点画圆接触边。 (共 4 次触摸)
        1. 之后,圆与每一边相交 2 次,直到第 4 步。(共 8 个相交)
        1. 上次圆只接触正方形的角。这时候我们需要找出圆的直径是多少? (共 4 次触摸)
          • 那个时候方形触摸圆的对角线(它的和弦)也穿过圆心,所以对角线是直径
          • 直径 = 对角线 = 边 * √2
        1. 之后,圆圈完全离开正方形。

    2. 中圆柔性正方形

    • 假设有一个中等大小的圆圈,其中心是非常小的正方形。
    • 增加正方形边的长度并检查所有情况。
        1. 首先完全在圆圈内成正方形。
        1. 第一次广场的角落触摸圆圈。 (共 4 次触摸)此时我们需要找出边的长度是多少? (共 4 次触摸)
          • 那个时候方形触摸圆的对角线(它的和弦)也穿过圆心,所以对角线是直径
          • 边 = 对角线 / √2 = 直径 / √2
        1. 之后,正方形的每条边与圆相交 2 次,直到第 4 步。(共 8 个相交)
        1. 上次,当直径和边长相同时,只有正方形的边中点接触圆。
        1. 之后,方形完全离开圆形。

    因此,在这两种情况下,圆形和正方形都在这两种状态之间相切(两种情况相同)。

    【讨论】:

      【解决方案2】:

      中心对齐后,分为三种情况:

      1. 广场外圈
      2. 圆与方相交
      3. 方内圆。

      如果圆的直径小于正方形长度的二分之一,则应用“3”。

      如果圆的直径大于从正方形中心到正方形角的距离,则应用“1”。这是正方形对角线长度的一半。

      “2”适用于所有其他情况。

      【讨论】:

        【解决方案3】:
        return diameter > length && diameter / 2 < length / Math.sqrt(2)
        

        第一个条件检查圆圈不在正方形内,第二个条件检查正方形不在圆圈内

        【讨论】:

        • 不完全是 OP 所寻找的,因为他希望了解问题而不仅仅是给出答案。
        • 补充一点,我相信连词的后半部分(&amp;&amp;)是在说圆的直径大于到角落的距离......见毕达哥拉斯。
        【解决方案4】:

        圆的方程是x^2 + y^2 = r^2 您只需要确定正方形的一条线是否与圆圈发生碰撞,以查看它们是否发生碰撞,因为它们在中心对齐。直线方程是x = c,其中c 是一个常数。您可以将 x 或 y 的值代入圆方程。例如,对于x = 2

        2^2 + y^2 = r^2 =&gt; 4 + y^2 = r^2

        r 也给了你,所以用 r = 1 =&gt; 4 + y^2 = 1^2 = 1 替换它

        =&gt; y^2 = -3

        因此,由于-3 没有(真正的)平方根,它们不会发生冲突。

        如果圆足够大,相对于正方形,最后一部分会有真正的解。我们的代表正方形边的直线方程实际上应该受到约束,因为正方形直线不会永远持续下去,它们会停在x = y = +- square_length/2。所以检查y(from equation) &lt; y(square_height)(或xwidth,它们是否相同)。因此,基本上,您需要检查两种情况。你可以把它变成代码。

        【讨论】: