寻找一个圆圈是否在另一个圆圈内
我有点麻烦。我有一项任务,要求我找出第二个圆圈是重叠的,还是第二个圆圈都是重叠的。但是,如果第二个圆圈在第一个圆圈内,我无法检查重叠。寻找一个圆圈是否在另一个圆圈内
(使用的变量是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");
}
我担心的问题是重叠的和内部的检查,但我无法弄清楚如何正确设置它,以便我可以可靠地检查第二个圆是否在第一个圆内。
任何帮助或建议将不胜感激,因为我尝试了多种方法,但解决方案每次都逃脱我。
你只需要重复之前检查里面为内侧的距离是
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");
}
答案通过评论代理修改为每克里斯的评论
是的,那是我的问题。我曾尝试过这一次,但我认为我命令错误地进行了错误的比较。 再次感谢。 – Battleroid 2012-02-28 17:25:10
你在那里有不必要的代码。由于r1和r2都是> 0(我假设它们是半径),因此r1 + r2不需要围绕它调用abs。如果你再把这张支票与你的第一张支票进行比较,那么你会注意到,如果第一张是错误的,那么它总是会被尝试,所以你可以跳过这个条件,并使最后一张很简单。 – Chris 2012-02-28 17:29:57
我知道我只是重新安排了原始问题中的代码,但它的好处是,我会发表评论。 – Dampsquid 2012-02-28 17:33:29
那么,如果距离和较小半径之和小于另一个半径,那么较小的圆应该在较大的圆内。
只有中心距离彼此足够近,否则可能有重叠或不重叠的圆圈。 – 2012-02-28 17:19:33
@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可能是感兴趣的功能。
或只是直接与毕达哥拉斯距离。
这个问题可能是最简单的工作了,然后编写代码。你看起来像你有正确的逻辑,不在里面,完全在里面。
处理这个问题的简单方法是,如果它们不完全在里面而不是完全在外面,那么它们必须重叠。这当然是我如何编码的。数学比另外两个有点棘手。
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-d
和r2 < 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");
}
在'不重叠'的情况下检查'内'情况下确保它不会被认为是重叠。然后所有其他的必须重叠。
你和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;
}
}
您应该使用代码按钮将其格式化为源代码。 – Thom 2014-01-15 15:50:06
首先 - 什么是距离?这是圆圈中心之间的距离吗?其次 - 它可以帮助找出哪个半径更大? – user1118321 2012-02-28 17:17:18
所有变量都由用户输入。是的,距离是距离公式中两个圆的两个中心之间的距离。 – Battleroid 2012-02-28 17:18:35
我只是用Google搜索找到这个问题,发现这个http://gamedev.stackexchange.com/questions/7172/how-to-find-out-if-two-circles-intersect-each-other – Jayy 2012-02-28 17:18:42