我正在尝试找到从2D空间中的指定点获取圆的最远点的最佳方法.到目前为止,我发现的是如何获得点和圆位置之间的距离,但我不完全确定如何扩展它以找到圆的最远点.
已知变量是:
为了找到点和圆位置之间的距离,我发现了这个:
xd = x2 - x1
yd = y2 - y1
距离= SquareRoot(xd*xd + yd*yd)
在我看来,这是解决方案的一部分.如何扩展以获得下图中的点x的位置?
作为问题的一个附加但可选的部分:我已经在一些地方读过,可以在不使用平方根的情况下获得距离部分,这是非常高性能的,如果需要快速代码则应该避免.就我而言,我会经常做这个计算; 在主要问题的范围内对此提出的任何评论也会受到欢迎.
那这个呢?
(或者,你可以计算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甚至有专门的规范化指令.