由给定距离分隔的圆上的点

时间:2013-08-03 19:58:28

标签: geometry trigonometry

首先,我不是要寻找围绕圆圈均匀间隔的点,我知道已经多次回答了。相反,我在一个圆上有一个点,我需要找到另一个与它有一定距离的点。

这是一个例子: enter image description here

距离可以是两点之间(黑色虚线),也可以是点之间圆周的长度(蓝线),最简单的是什么(精度不是很重要)。

我知道以下变量:

  • (绿点x,y)
  • d
  • - [R
  • (中心点x,y)

那么如何才能找到其中一个红点?

2 个答案:

答案 0 :(得分:3)

所以,基本上你想得到两个圆圈的交点:

  1. 大的(BluePoint,radius = R)
  2. 一个小的(GreenPoint,radius = D)
  3. enter image description here
    (请原谅我惊人的绘画技巧:P)

    我起初试图自己解决这个问题,并且毫无结果地浪费了几张纸。

    然后我开始谷歌搜索并在其他问题上找到algorithm


    这是我的 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] + "]");
    

答案 1 :(得分:0)

enter image description here

在两个轴上向下投射右红点以获得X和Y.

从那里,你将获得2个不同的直角三角形:

equation setup


解决方案:

equation solution