【问题标题】:Points on circle separated by given distance由给定距离分隔的圆上的点
【发布时间】:2013-08-03 19:58:27
【问题描述】:

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

这是一个插图:

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

我知道以下变量:

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

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

【问题讨论】:

  • 嗯,我正在使用这个数学计算 3D 游戏。有没有更好的地方问?
  • 如果你给我一些时间,我会努力解决的。
  • 非常感谢,那太好了。
  • 我希望你不会介意它是否使用 Java
  • 我在 C# 中工作(非常相似),那太好了。

标签: geometry trigonometry


【解决方案1】:

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

  1. 大的(蓝点,半径 = R)
  2. 一个小的(GreenPoint,半径 = D)


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

【讨论】:

  • 看起来不错。我会尽快将其转换为 c# 并进行测试。
【解决方案2】:

在两个轴上向下投影右侧的红点以获得 X 和 Y。

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


解决方案:

【讨论】:

  • 我错了,还是如果情况是轴对齐的?
  • 我喜欢你的解决方案,它看起来既漂亮又简单——但恐怕它不适用于这种情况:蓝点和绿点显然可以在 2D 空间中的任何位置,并且可以旋转坐标系真的很痛苦。
猜你喜欢
  • 2016-09-12
  • 1970-01-01
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-23
  • 2020-12-24
  • 1970-01-01
相关资源
最近更新 更多