从点找圆圈中最远的点

Cla*_*dia 1 geometry

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

已知变量是:

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

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

xd = x2 - x1

yd = y2 - y1

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

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

这里以图形方式解释了这个问题. 期望的结果是点x的位置. 作为问题的一个附加但可选的部分:我已经在一些地方读过,可以在不使用平方根的情况下获得距离部分,这是非常高性能的,如果需要快速代码则应该避免.就我而言,我会经常做这个计算; 在主要问题的范围内对此提出的任何评论也会受到欢迎.

Dam*_*mon 6

那这个呢?

  1. 计算AB.
    我们现在有一个向量从圆心指向A(如果B是原点,跳过这个,只考虑点A为向量).
  2. 规范化.现在我们有一个明确定义的长度(长度为1)
  3. 如果圆不是单位半径,则乘以半径.如果是单位半径,请跳过此.现在我们有正确的长度.
  4. 反转符号(可以用3.一步完成,只需与负半径相乘)
    现在我们的向量指向正确的方向.
  5. 添加B(如果B是原点,请跳过此处).
    现在我们的向量正确偏移,因此它的端点是我们想要的点.

(或者,你可以计算BA以保存否定,但是你必须再做一次操作来正确地偏移原点.)

顺便说一句,它在3D中的工作方式相同,除了圆圈是一个球体,并且矢量将有3个分量(或4,如果你使用同质的coords,在这种情况下记住 - 为了正确性 - 将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;
}
Run Code Online (Sandbox Code Playgroud)

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