Java 以编程方式查找三个圆的交点
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/19723641/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Find intersecting point of three circles programmatically
提问by Alex Chengalan
As the title says, I have 3 Circle.
正如标题所说,我有3 Circle。
Each one have different radius. I know the radius of each circles.
每一颗都有不同的半径。我知道每个圆的半径。
Also know the center pointsof each circle.
还要知道每个圆的中心点。
Now I need to know how I can calculate the intersecting point of three circles programmatically, is there is any formula or something?
现在我需要知道如何以编程方式计算三个圆的交点,有什么公式吗?
It may look like below image
它可能看起来像下图
回答by Alex Chengalan
You can use the following condition:
您可以使用以下条件:
(x - x0) ^ 2 + (y - y0) ^ 2 <= R ^ 2
where x and y - coordinates of your point , x0 and y0 - coordinates of the center of the circle , R - radius of the circle , ^ 2 - squaring . If the condition is satisfied, the point is inside (or on the circumference in the case of equality of the left and right parts). If not satisfied, the point is outside the circle .
其中 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;
回答by Amulya Khare
You could get help from this C code. Porting it to JAVA should not be challenging. Explanation is here. Search for/scroll to: intersection of two circles
你可以从这个C 代码中得到帮助。将它移植到 JAVA 应该没有挑战性。解释在这里。搜索/滚动到:两个圆的交点
Using this method, find the intersection of any two circles.. lets say (x,y)
. Now the third circle will intersect at point x,y
only if distance between its center
and point x,y
is equal to r
.
使用这种方法,找到任意两个圆的交点..让我们说(x,y)
。现在第三圈将在相交点x,y
只有在其之间的距离center
和点x,y
等于r
。
case 1)
If distance(center,point) == r
, then x,y
is the intersection point.
case 1)
如果distance(center,point) == r
,则x,y
是交点。
case 2)
If distance(center,point) != r
, then no such point exists.
case 2)
如果distance(center,point) != r
,则不存在这样的点。
Code (ported from [here! all credits to original author):
代码(从[这里移植!所有学分给原作者):
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;
}
Call this method as follows:
调用这个方法如下:
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)
Also, define EPSILON
to a small value that is acceptable for your application requirements
此外,定义EPSILON
为您的应用程序要求可接受的小值
private static final double EPSILON = 0.000001;
Note: Maybe some one should test and verify if the results are correct. I can't find any easy way to do so..works for the basic cases that I have tried
注意:也许有人应该测试并验证结果是否正确。我找不到任何简单的方法来做到这一点..适用于我尝试过的基本案例