寻找一个圆圈是否在另一个圆圈内

问题描述:

我有点麻烦。我有一项任务,要求我找出第二个圆圈是重叠的,还是第二个圆圈都是重叠的。但是,如果第二个圆圈在第一个圆圈内,我无法检查重叠。寻找一个圆圈是否在另一个圆圈内

(使用的变量是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"); 
} 

我担心的问题是重叠的和内部的检查,但我无法弄清楚如何正确设置它,以便我可以可靠地检查第二个圆是否在第一个圆内。

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

+1

首先 - 什么是距离?这是圆圈中心之间的距离吗?其次 - 它可以帮助找出哪个半径更大? – user1118321 2012-02-28 17:17:18

+0

所有变量都由用户输入。是的,距离是距离公式中两个圆的两个中心之间的距离。 – Battleroid 2012-02-28 17:18:35

+0

我只是用Google搜索找到这个问题,发现这个http://gamedev.stackexchange.com/questions/7172/how-to-find-out-if-two-circles-intersect-each-other – Jayy 2012-02-28 17:18:42

你只需要重复之前检查里面为内侧的距离是

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"); 
} 

答案通过评论代理修改为每克里斯的评论

+0

是的,那是我的问题。我曾尝试过这一次,但我认为我命令错误地进行了错误的比较。 再次感谢。 – Battleroid 2012-02-28 17:25:10

+1

你在那里有不必要的代码。由于r1和r2都是> 0(我假设它们是半径),因此r1 + r2不需要围绕它调用abs。如果你再把这张支票与你的第一张支票进行比较,那么你会注意到,如果第一张是错误的,那么它总是会被尝试,所以你可以跳过这个条件,并使最后一张很简单。 – Chris 2012-02-28 17:29:57

+0

我知道我只是重新安排了原始问题中的代码,但它的好处是,我会发表评论。 – Dampsquid 2012-02-28 17:33:29

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

+0

只有中心距离彼此足够近,否则可能有重叠或不重叠的圆圈。 – 2012-02-28 17:19:33

+1

@JonathanDrapeau。对不起,但这不是事实。至少,只要*距离*意味着两个中心之间的距离。如果这些中心足够远以至于这些圆相交,那么我们可能有两种情况:a)一个圆的中心在另一个圆内=> d + r2> r1 || d + r1> r2;或者b)在另一个圆圈内没有圆心=> d> r1 ||已经有了。 – Matthias 2012-02-28 19:30:19

编辑为显而易见的重叠< =距离:

距离点之间的距离由毕达哥拉斯描述:

distance = sqrt(travelled_x_squared + travelled_y_squared); 

这当然转换为代码作为

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

的距离是在在R1 + R2接触。

编辑线索之前: 您需要圆之间的角度。

然后你计算从circle1到circle2的距离。如果它小于radii1 + radii2,你就在里面。

atan2可能是感兴趣的功能。

或只是直接与毕达哥拉斯距离。

+2

角度完全不相关。您始终可以考虑通过两个中心的线和沿着这些线的距离(距离r1,r2)。 – Chris 2012-02-28 17:23:08

+0

@Chris是的,这是毕达哥拉斯距离。 – 2012-02-28 17:26:01

+0

我不确定这解释了为什么你认为你需要角度。你只会使事情变得复杂,而atan2对这个问题并不感兴趣,并且会导致你走向错误解决方案的道路...... – Chris 2012-02-28 17:31:13

这个问题可能是最简单的工作了,然后编写代码。你看起来像你有正确的逻辑,不在里面,完全在里面。

处理这个问题的简单方法是,如果它们不完全在里面而不是完全在外面,那么它们必须重叠。这当然是我如何编码的。数学比另外两个有点棘手。

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

通过symmetery我们并不需要做双向轮(如果换成R2和R1两个,做了比特重新排列的你会得到相同的一对方程)。

其最简单不过,而不是编码它,除非你需要为某些原因,刚刚离开这个在“其他”类别。

其简单的任务,

取两个圆的半径的总和。说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

你非常近有两个圆弧的中心之间的距离。这只是条件错误的顺序。

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"); 
} 

在'不重叠'的情况下检查'内'情况下确保它不会被认为是重叠。然后所有其他的必须重叠。

+0

你和Dampsquid是对的钱。 我之前尝试过,但我疯狂比较,所以每次都会回来。 – Battleroid 2012-02-28 17:26:39

/** 
    * 
    * @param values { x0, y0, r0, x1, y1, r1 } 
    * @return true if circles is intersected 
    */ 
    public static boolean isCircleIntersect(double... values) 
    { 
    /* check using mathematical relation: ABS(R0-R1) <= SQRT((x0-x1)^2+(y0-y1)^2) <= (R0+R1) */ 
    if (values.length == 6) 
    { 
     /* get values from first circle */ 
     double x0 = values[0]; 
     double y0 = values[1]; 
     double r0 = values[2]; 
     /* get values from second circle */ 
     double x1 = values[3]; 
     double y1 = values[4]; 
     double r1 = values[5]; 
     /* returun result */ 
     return (Math.abs(r0 - r1) <= Math.sqrt(Math.pow((x0 - x1), 2) + Math.pow((y0 - y1), 2))) 
       && (Math.sqrt(Math.pow((x0 - x1), 2) + Math.pow((y0 - y1), 2)) <= (r0 + r1)); 
    } 
    else 
    { 
     /* return default result */ 
     return false; 
    } 
    } 
+0

您应该使用代码按钮将其格式化为源代码。 – Thom 2014-01-15 15:50:06