【问题标题】:Finding most distant point in circle from point从点找到最远的点
【发布时间】:2012-06-12 20:13:58
【问题描述】:

我正在尝试找到从 2D 空间中的指定点获取圆的最远点的最佳方法。到目前为止我发现的是如何获得点与圆位置之间的距离,但我不完全确定如何扩展它以找到圆的最远点。

已知变量有:

  • 点一个
  • 点 b(圆位置)
  • 半径 r(圆半径)

要找到点和圆位置之间的距离,我找到了这个:

xd = x2 - x1

yd = y2 - y1

距离 = 平方根(xd * xd + yd * yd)

在我看来,这是解决方案的一部分。这将如何扩展以获得下图中点 x 的位置?

作为问题的附加但可选的部分:我在某些地方读到,可以在不使用平方根的情况下获得距离部分,这是非常性能密集型的,如果需要快速代码,应该避免使用。就我而言,我会经常进行这种计算;在主要问题的背景下,任何关于此的 cmets 也将受到欢迎。

【问题讨论】:

    标签: geometry


    【解决方案1】:

    这个怎么样?

    1. 计算 A-B。
      我们现在有一个从圆心指向 A 的向量(如果 B 是原点,请跳过此步骤,将点 A 视为向量)。
    2. 标准化。 现在我们有了一个定义好的长度(长度为1)
    3. 如果圆不是单位半径,则乘以半径。如果是单位半径,则跳过此。 现在我们有了正确的长度。
    4. 反转符号(可以用 3. 一步完成,只需乘以负半径)
      现在我们的向量指向了正确的方向。
    5. 添加 B(如果 B 是原点,请跳过此步骤)。
      现在我们的向量被正确偏移了,所以它的端点就是我们想要的点。

    (或者,你可以计算 B-A 来保存否定,但你必须再做一次操作才能正确偏移原点。)

    顺便说一下,它在 3D 中的工作方式相同,除了圆是球体,向量将有 3 个分量(或 4 个分量,如果您使用同质坐标,在这种情况下请记住 - 为了正确起见 - 设置w 在“将点转化为向量”时为 0,当从向量中生成一个点时为 1)。

    编辑:
    (回复伪代码)
    假设您有一个 vec2 类,它是一个由两个浮点数组成的结构,带有用于向量减法和标量乘法的运算符(非常简单,大约十几行代码)和一个函数 normalize,它只需要是乘法的简写使用inv_sqrt(x*x+y*y),伪代码(我这里的伪代码类似于 C++/GLSL 混合)可能看起来像这样:

    vec2 most_distant_on_circle(vec2 const& B, float r, vec2 const& A)
    {
        vec2 P(A - B);
        normalize(P);
        return -r * P + B;
    }
    

    您使用的大多数数学库都应该内置所有这些函数和类型。 HLSL 和 GLSL 将它们作为第一类原语和内在函数。有些 GPU 甚至有专门的规范化指令。

    【讨论】:

    • 你打败了我。我正要写:将 A 投影到圆上,然后镜像坐标。
    • 哇,你的回答很快就来了。尽管可能会赞赏一些进一步的细节。鉴于我在这里问了这个问题(而不是math.stackexchange.com),我敢于要求一些伪代码。谢谢!
    • 谢谢!这正是我所需要的。感谢您抽出宝贵时间并愿意编辑回复。
    猜你喜欢
    • 2012-03-14
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-02-13
    相关资源
    最近更新 更多