1

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

已知的变量是:

  • 点a
  • b点(圆位置)
  • 半径 r(圆半径)

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

xd = x2 - x1

yd = y2 - y1

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

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

此处以图形方式解释了该问题。 期望的结果是点 x 的位置。 作为问题的附加但可选的部分:我在某些地方读到,可以在不使用平方根的情况下获得距离部分,这是非常性能密集型的,如果需要快速代码,应该避免使用。就我而言,我会经常进行这种计算;也欢迎在主要问题的背景下对此发表任何评论。

4

1 回答 1

6

那这个呢?

  1. 计算 AB。
    我们现在有一个从圆心指向 A 的向量(如果 B 是原点,跳过这个,只考虑点 A 一个向量)。
  2. 标准化。现在我们有一个明确定义的长度(长度为 1)
  3. 如果圆不是单位半径,则乘以半径。如果是单位半径,则跳过此。现在我们有了正确的长度。
  4. Invert sign (can be done in one step with 3., just multiply with the negative radius)
    Now our vector points in the correct direction.
  5. Add B (if B is the origin, skip this).
    Now our vector is offset correctly so its endpoint is the point we want.

(Alternatively, you could calculate B-A to save the negation, but then you have to do one more operation to offset the origin correctly.)

By the way, it works the same in 3D, except the circle would be a sphere, and the vectors would have 3 components (or 4, if you use homogenous coords, in this case remember -- for correctness -- setting w to 0 when "turning points into vectors" and to 1 at the end when making a point from the vector).

编辑:(
作为伪代码的回复)
假设你有一个 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 甚至有专门的规范化指令。

于 2012-06-11T14:22:45.787 回答