Geometry 以给定距离分隔的圆上的点

Geometry 以给定距离分隔的圆上的点,geometry,trigonometry,Geometry,Trigonometry,首先,我不是在寻找围绕一个圆均匀分布的点,我知道这已经被回答了很多次了。相反,我在一个圆上有一个点,我需要找到另一个离它一定距离的点 下面是一个例子: 距离可以是两点之间的距离(黑色虚线),也可以是两点之间的周长(蓝色线),只要是最简单的(精度不是很重要) 我知道以下变量: (绿点x,y) d r (中心点x,y) 那么我怎样才能找到其中一个红点呢?所以,基本上你想要得到两个圆的交点: 大的(蓝点,半径=R) 一个小的(绿点,半径=D) (请原谅我惊人的绘画技巧:P) 起初我试图自己解决

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

下面是一个例子:

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

我知道以下变量:

  • (绿点x,y)
  • d
  • r
  • (中心点x,y)

那么我怎样才能找到其中一个红点呢?

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

  • 大的(蓝点,半径=R)
  • 一个小的(绿点,半径=D)

  • (请原谅我惊人的绘画技巧: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);
    }
    

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

  • 大的(蓝点,半径=R)
  • 一个小的(绿点,半径=D)

  • (请原谅我惊人的绘画技巧: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);
    }
    

    将右红色点投影到两个轴上,得到X和Y

    从那里,您将得到两个不同的直角三角形:


    解决方案:

    将右红色点投影到两个轴上,得到X和Y

    从那里,您将得到两个不同的直角三角形:


    解决方案:


    好吧,我用这个数学来计算3D游戏。有什么地方更适合问吗?如果你给我一些时间,我会尝试解决它。非常感谢,那太好了。我希望你不会介意它是否是Java的。我正在用C#(非常类似),所以这很好。好吧,我正在用这个数学为3D游戏做计算。有没有更好的地方可以问?如果你给我一些时间,我会尝试解决它。非常感谢,那太好了。我希望你不会介意它是否是Java的。我用C#(非常类似),所以很好。我错了吗,或者只有在轴对齐的情况下才有效?我喜欢你的解决方案,这看起来很简单,但我担心它在这种情况下不起作用:蓝点和绿点显然可以在2D空间的任何地方,旋转坐标系真的很痛苦。我错了吗,或者只有在轴对齐的情况下,这才起作用?我喜欢你的解决方案,它看起来很简单,但我担心它在这种情况下不起作用:蓝色和绿色的点显然可以在二维空间的任何地方,旋转坐标系真的很痛苦。这看起来很棒。我将把它转换成c#并很快进行测试。看起来很棒。我将很快将其转换为c#并进行测试。