正如标题所说, 我有 3 Circle 。
每个人都有不同的半径。我知道每个圆圈的半径。
同时了解每个圈子的中心点。
现在我需要知道如何以编程方式计算三个圆的交点,是否有任何公式或什么?
它可能看起来像下面的图像
答案 0 :(得分:7)
您可以从C code获得帮助。将它移植到JAVA不应该具有挑战性。解释是here。搜索/滚动到:两个圆圈的交叉
使用此方法,找到任意两个圆圈的交集..让我们说(x,y)
。现在,只有当x,y
和点center
之间的距离等于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;
注意:也许有人应该测试并验证结果是否正确。我无法找到任何简单的方法。我尝试过的基本案例的工作
答案 1 :(得分:4)
您可以使用以下条件:
(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 = p.x - center.x;
float dy = p.y - 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;