从点找圆圈中最远的点

时间:2012-06-11 14:14:33

标签: geometry

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

已知变量是:

  • 指向
  • 点b(圆圈位置)
  • 半径r(圆半径)

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

  

xd = x2 - x1

     

yd = y2 - y1

     

距离= SquareRoot(xd * xd + yd * yd)

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

The problem is graphically explained here. The desired outcome is the position of Point x. 作为问题的一个附加但可选的部分:我已经在一些地方读过,可以在不使用平方根的情况下获得距离部分,这是非常高性能的,如果需要快速代码则应该避免。就我而言,我会经常做这个计算;在主要问题的范围内对此提出的任何意见也会受到欢迎。

1 个答案:

答案 0 :(得分:6)

这个怎么样?

  1. 计算A-B。
    我们现在有一个向量从圆心指向A(如果B是原点,跳过这个,只考虑点A是一个向量)。
  2. 正常化。 现在我们有一个定义良好的长度(长度为1)
  3. 如果圆圈单位半径,则乘以半径。如果是单位半径,请跳过此。 现在我们正确的长度。
  4. 反转符号(可以与3.一步完成,只需与负半径相乘)
    现在我们的向量指向正确的方向。
  5. 添加B(如果B是原点,请跳过此处) 现在我们的向量被正确偏移,因此它的端点就是我们想要的点。
  6. (或者,你可以计算B-A来保存否定,但是你必须再做一次操作来正确地偏移原点。)

    顺便说一句,它在3D中的工作方式相同,除了圆圈是一个球体,并且矢量将有3个组件(或4,如果你使用同质的coords,在这种情况下记住 - 为了正确性 - 设置当“将点转换为向量”时, w 为0,当从向量中指向点时, w 为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甚至有专门的规范化指令。