以编程方式查找三个圆的相交点

正如标题所说,我有3圈

每个人都有不同的半径 。 我知道每个圈子的半径。

也知道每个圆圈的中心点

现在我需要知道如何以编程方式计算三个圆的交点,是否有任何公式或什么?

它可能看起来像下面的图像 在这里输入图像说明

Solutions Collecting From Web of "以编程方式查找三个圆的相交点"

你可以从这个C代码中获得帮助。 将它移植到JAVA应该不是富有挑战性的。 说明就在这里 。 search/滚动到: 两个圆的交点

使用这种方法,find任意两个圆的交点。让我们说(x,y) 。 现在第三个圆只有在x,y点与x,y点的距离等于r时才相交。

case 1)如果distance(center,point) == r ,那么x,y是交点。

case 2)如果distance(center,point) != r ,则不存在这样的点。

代码(从这里移植到原作者的所有学分):

 private boolean calculateThreeCircleIntersection(double x0, double y0, double r0, double x1, double y1, double r1, double x2, double y2, double r2) { double a, dx, dy, d, h, rx, ry; double point2_x, point2_y; /* dx and dy are the vertical and horizontal distances between * the circle centers. */ dx = x1 - x0; dy = y1 - y0; /* Determine the straight-line distance between the centers. */ d = Math.sqrt((dy*dy) + (dx*dx)); /* Check for solvability. */ if (d > (r0 + r1)) { /* no solution. circles do not intersect. */ return false; } if (d < Math.abs(r0 - r1)) { /* no solution. one circle is contained in the other */ return false; } /* 'point 2' is the point where the line through the circle * intersection points crosses the line between the circle * centers. */ /* Determine the distance from point 0 to point 2. */ a = ((r0*r0) - (r1*r1) + (d*d)) / (2.0 * d) ; /* Determine the coordinates of point 2. */ point2_x = x0 + (dx * a/d); point2_y = y0 + (dy * a/d); /* Determine the distance from point 2 to either of the * intersection points. */ h = Math.sqrt((r0*r0) - (a*a)); /* Now determine the offsets of the intersection points from * point 2. */ rx = -dy * (h/d); ry = dx * (h/d); /* Determine the absolute intersection points. */ double intersectionPoint1_x = point2_x + rx; double intersectionPoint2_x = point2_x - rx; double intersectionPoint1_y = point2_y + ry; double intersectionPoint2_y = point2_y - ry; Log.d("INTERSECTION Circle1 AND Circle2:", "(" + intersectionPoint1_x + "," + intersectionPoint1_y + ")" + " AND (" + intersectionPoint2_x + "," + intersectionPoint2_y + ")"); /* Lets determine if circle 3 intersects at either of the above intersection points. */ dx = intersectionPoint1_x - x2; dy = intersectionPoint1_y - y2; double d1 = Math.sqrt((dy*dy) + (dx*dx)); dx = intersectionPoint2_x - x2; dy = intersectionPoint2_y - y2; double d2 = Math.sqrt((dy*dy) + (dx*dx)); if(Math.abs(d1 - r2) < EPSILON) { Log.d("INTERSECTION Circle1 AND Circle2 AND Circle3:", "(" + intersectionPoint1_x + "," + intersectionPoint1_y + ")"); } else if(Math.abs(d2 - r2) < EPSILON) { Log.d("INTERSECTION Circle1 AND Circle2 AND Circle3:", "(" + intersectionPoint2_x + "," + intersectionPoint2_y + ")"); //here was an error } else { Log.d("INTERSECTION Circle1 AND Circle2 AND Circle3:", "NONE"); } return true; } 

调用这个方法如下:

 calculateThreeCircleIntersection(-2.0, 0.0, 2.0, // circle 1 (center_x, center_y, radius) 1.0, 0.0, 1.0, // circle 2 (center_x, center_y, radius) 0.0, 4.0, 4.0);// circle 3 (center_x, center_y, radius) 

另外,将EPSILON定义为适用于您的应用程序要求的小值

 private static final double EPSILON = 0.000001; 

注意:也许有人应该testing和validation结果是否正确。 我找不到任何简单的方法来做这件事

您可以使用以下条件:

 (x - x0) ^ 2 + (y - y0) ^ 2 <= R ^ 2 

其中x和y是你的点的坐标,x0和y0是圆心的坐标,R是圆的半径,^ 2 – 平方。 如果条件满足,则该点位于内部(或者在左右部分相等的情况下在圆周上)。 如果不满意,这一点在圈子之外。

 / / Point, which hit the circle is necessary to determine PointF p = ...; / / Center of the circle PointF center = new PointF (10, 10); / / The radius of the circle float r = 5F; / / "Normalize" the situation relative to the center point of the circle float dx = px - center.x; float dy = py - center.y; / / Compare the distance from the point to the center of a circle to its radius boolean result = ((r * r) <= (dx * dx + dy * dy))) ? true : false;