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