我希望我能清楚地解释这一点。我正在尝试计算 3D 圆上的最近点。我找到了以下解决方案: http ://www.geometrictools.com/Documentation/DistancePoint3Circle3.pdf
我的代码如下(用 Lua 编写)。主要问题是投影Q似乎不正确,或者我不明白如何正确计算它。正如您在论文中看到的那样,Q 应该是圆平面上点的投影。
例如圆的法线是{0,1,0},它的中心位于{3,3,3}。我试图计算到圆的最近距离的点 (p) 位于 {6, 3, 2}。然后,在我的计算中,在圆平面上的投影 Q 是 {6, 0, 2}。
为了使算法工作,我似乎必须用平面的位置偏移 Q,例如在其法线方向上的圆心分量。在这种情况下,y 方向的值为 3。
我可以破解这个普通的 {0,1,0} 因为它很容易,但是一旦圆将面对任何任意位置,我不知道如何计算它。
我错过了什么,我哪里出错了?
function calculatePointCircleDistance(p, circleCenter, circleNormal, circleRadius)
local C = circleCenter
local R = circleRadius
local Q = projectVectorOntoPlane(p, circleNormal)
-- I need to do a fix like this in order to get the calculations right
-- This for example only works with circleNormal {0,1,0}
-- Adding the y component of the circle position to the projection Q
Q[2] = C[2]
if vec3.equal(Q, C) == 1 then
print("point exacly aligned with center circle")
return vec3.mag(vec3.sub(C, p)), C
end
-- the following is calculating X=C+R (Q−C / |Q−C|)
local QminC = vec3.sub(Q, C)
local tmp = vec3.scale(vec3.div(QminC, vec3.mag(QminC)), R)
local X = vec3.add(C, tmp)
-- return distance as |X-p| as well as point X
return vec3.mag(vec3.sub(X, p)), X
end
function projectVectorOntoPlane(v, normal)
-- U = V - (V dot N)N
local vProjected = vec3.sub(v, vec3.scale(normal, vec3.dot(v, normal)))
return vProjected
end