有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java查找一个圆是否在另一个圆内

我有点麻烦。我有一项作业,要求我找出第二个圆是重叠的、在第二个圆之内的,还是两者都没有。然而,我在检查重叠以及第二个圆是否在第一个圆内时遇到了问题

(使用的变量为x1、x2、y1、y2、r1、r2、距离)

以下是我所拥有的:

if (distance > (r1 + r2)) {
        // No overlap
        System.out.println("Circle2 does not overlap Circle1");
    } else if (distance <= Math.abs(r1 + r2)) {
        // Overlap
        System.out.println("Circle2 overlaps Circle1");
    } else if ((distance <= Math.abs(r1 - r2)) {
        // Inside
        System.out.println("Circle2 is inside Circle1");
}

我担心问题在于重叠和内部检查,但我不知道如何正确设置,以便可靠地检查第二个圆圈是否在第一个圆圈内

任何帮助或建议都将不胜感激,因为我尝试了多种方法,但每次都无法找到解决方案


共 (6) 个答案

  1. # 1 楼答案

    重叠前只需检查内侧,因为内侧的距离为<;=重叠距离

    if (distance > (r1 + r2)) 
    {
        // No overlap
        System.out.println("Circle2 does not overlap Circle1");
    }
    else if ((distance <= Math.abs(r1 - r2)) 
    {
        // Inside
        System.out.println("Circle2 is inside Circle1");
    }
    else              // if (distance <= r1 + r2)
    {
       // Overlap
       System.out.println("Circle2 overlaps Circle1");
    } 
    

    根据Chris的评论修改答案

  2. # 2 楼答案

    你就快到了。这只是条件的顺序不对

    if (distance > (r1 + r2)) {
            // No overlap
            System.out.println("Circle2 does not overlap Circle1");
        } else if ((distance <= Math.abs(r1 - r2)) {
            // Inside
            System.out.println("Circle2 is inside Circle1");
        } else {
            // Overlap
            System.out.println("Circle2 overlaps Circle1");
    }
    

    在“非重叠”案例之后检查“内部”案例,确保不会意外地将其视为重叠。那么所有其他的都必须是重叠的

  3. # 3 楼答案

    这个问题可能最简单的方法是先直观地解决,然后再编写代码。你看起来有正确的逻辑,不在里面,完全在里面

    解决这个问题的简单方法是,如果它们不完全在内部,也不完全在外部,那么它们必须重叠。这当然是我编写代码的方式。这道数学题比另外两道题要难一点

    if (distance > (r1 + r2)) {
        // No overlap
        System.out.println("Circle2 does not overlap Circle1");
    } else if ((distance <= Math.abs(r1 - r2)) {
        // Inside
        System.out.println("Circle2 is inside Circle1");
    { else {
        // Overlap
        System.out.println("Circle2 overlaps Circle1");
    }
    

    实际情况是:

    r2>r1-dr2 < r1+d

    根据对称性,我们不需要做两个循环(如果你在两个循环中交换r2和r1,并重新排列,你会得到相同的方程对)

    不过,除非出于某种原因需要,否则最简单的方法是将其留在“else”类别中,而不是为其编码

  4. # 4 楼答案

    这是一项简单的任务

    取两个圆的半径之和。说r1+r2。 现在求出两个圆心之间的距离,即sqrt((x1-x2)^2+(y1-y2)^2) if r1+r2 = sqrt((x1-x2)^2 + (y1-y2)^2) they just touch each other. if r1+r2 > sqrt((x1-x2)^2 + (y1-y2)^2) the circle overlaps(intersect) if r1+ r2 < sqrt((x1-x2)^2 + (y1-y2)^2) the circle doesnot intersect

  5. # 5 楼答案

    按注释代理编辑以获得明显性:

    毕达哥拉斯描述了空间中点到点之间的距离:

      distance = sqrt( travelled_x_squared + travelled_y_squared );
    

    这当然可以翻译成代码

      distance = Math.sqrt(  (x1-x2)*(x1-x2) + (y1 - y2)*(y1 - y2) );
    

    距离在r1+r2处接触

    编辑线索前: 你需要两个圆之间的角度

    然后计算从圆1到圆2的距离。如果它小于半径1+半径2,你就在里面

    atan2可能是一个感兴趣的函数

    或者直接用毕达哥拉斯距离

  6. # 6 楼答案

    如果距离和较小半径之和小于另一个半径,较小的圆应该在较大的圆内