使用法向量的垂直距离

Perpendicular Distance using Normal Vector

我目前正在编写一个脚本,用于确定从一个点到由两个矢量点创建的直线的最短距离。该脚本将在图形程序中使用以进行贝塞尔曲线裁剪,因此将被执行数千次。

由于这个要求,我试图在两点之间使用一条标准化线,这样计算距离就不会对用户造成太大的负担。我的问题是,尽管我努力修复了算法,但它似乎无法正常工作。

代码

for i=0,4 do
    p0:Set(math.random(-100,100),math.random(-100,100))
    p1:Set(math.random(-100,100),math.random(-100,100))
    v1:Set(math.random(-100,100),math.random(-100,100))

    local NormVec = p1-p0  --determine difference between 2 vectors
    NormVec:NormMe() --normalizes vector

    local slope = NormVec.y / NormVec.x 

    local YIntercept = p0.y-slope*p0.x

    local Dist = math.abs(NormVec.y*v1.x + NormVec.x*v1.y + 
    YIntercept)
end

在这段代码中,我定义了一些随机向量 p0、p1、v1。然后我确定 p0 和 p1 之间的一条线。我规范化这条线。然后我找到斜率并使用它来找到 YIntercept。我终于把它代入到归一化曲线的距离公式中,但我的结果总是错误的。

有关垂直距离的信息可在以下 link 中找到: A mathematics website regarding relevant equations

你的方程推导有错误,所以至少第二个被加数的符号是​​错误的(也避免在向量计算中使用斜率)

 equation of line through two points:
(x-x0) / (x1-x0) = (y-y0) / (y1-y0)
(x1-x0) / dx = (y-y0) / dy
normvec = (dx / length(dx,sy), dy / length(dx,sy))
(x1-x0) / normvex.x = (y-y0) / normvec.y

(x-x0) * normvec.y = (y-y0) * normvec.x
so right equation is
x * normvec.y - y * normvec.x + (y0 * normvec.x - x0 * normvec.y) = 0

关于距离:我们需要求出P点到直线的垂线长度。这个长度是斜边(P-P0)的长度乘以角度的正弦,所以我们可以用向量(P-P0)和方向单位向量normvec的叉积来得到距离

快速检查:

x0 = 4 y0 = 0 x1 = 0 y1 = 3
normvec.x = 4/5 
normvec.y =  - 3/5 
equation
x * -3/5  - y * 4/5 + 12/5 = 0
DistanceTo(4,3)  = Abs(-12/5 - 12/5 + 12/5) = 12/5

geometrical approach:
height to archimedean triangle hypotenuse 
Area = 1/2 * 3 * 4 = 1/2 * h * 5 so h = 12/5