首先,我不是在寻找围绕一个圆圈均匀分布的点,我知道这已经被回答了很多次。相反,我在一个圆上有一个点,我需要找到另一个与它有一定距离的点。
这是一个插图:
距离可以是两点之间的距离(黑色虚线),也可以是两点之间的圆周长度(蓝线),只要是最简单的(精度不是很重要)。
我知道以下变量:
- (绿点 x,y)
- d
- r
- (中心点 x, y)
那么我怎样才能找到其中一个红点呢?
首先,我不是在寻找围绕一个圆圈均匀分布的点,我知道这已经被回答了很多次。相反,我在一个圆上有一个点,我需要找到另一个与它有一定距离的点。
这是一个插图:
距离可以是两点之间的距离(黑色虚线),也可以是两点之间的圆周长度(蓝线),只要是最简单的(精度不是很重要)。
我知道以下变量:
那么我怎样才能找到其中一个红点呢?
所以,基本上你想得到两个圆的交点:
(请原谅我惊人的绘画技巧:P)
我一开始试图自己解决它,但徒劳无功地浪费了几张纸。
然后我开始搜索并在其他问题中找到了一个算法。
这是我的Java实现
double[][] getCircleIntersection(
double x0, double y0, double r0,
double x1, double y1, double r1) {
// dist of centers
double d = sqrt(sq(x0 - x1) + sq(y0 - y1));
if (d > r0 + r1) return null; // no intersection
if (d < abs(r0 - r1)) return null; // contained inside
double a = (sq(r0) - sq(r1) + sq(d)) / (2 * d);
double h = sqrt(sq(r0) - sq(a));
// point P2
double x2 = x0 + a * (x1 - x0) / d;
double y2 = y0 + a * (y1 - y0) / d;
// solution A
double x3_A = x2 + h * (y1 - y0) / d;
double y3_A = y2 - h * (x1 - x0) / d;
// solution B
double x3_B = x2 - h * (y1 - y0) / d;
double y3_B = y2 + h * (x1 - x0) / d;
return new double[][] {
{ x3_A, y3_A },
{ x3_B, y3_B }
};
}
// helper functions
double sq(double val) {
return Math.pow(val, 2);
}
double sqrt(double val) {
return Math.sqrt(val);
}
double abs(double val) {
return Math.abs(val);
}
这是您在问题情况下使用它的方式:
double centerX = 0;
double centerY = 0;
double radius = 5;
double pointX = 10;
double pointY = 0;
double newPointDist = 5;
double[][] points = getCircleIntersection(centerX, centerY, radius, pointX, pointY, newPointDist);
System.out.println("A = [" + points[0][0] + " , " + points[0][3] + "]");
System.out.println("B = [" + points[1][0] + " , " + points[1][4] + "]");
在两个轴上向下投影右红点以获得 X 和 Y。
从那里,您将获得 2 个不同的直角三角形:
解决方案: