使用法向量的垂直距离

时间:2018-04-21 20:18:22

标签: math vector distance vectormath

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

由于这个要求,我正在尝试利用两点之间的标准化线,这样计算距离就不会对用户造成太大影响。我的问题是,尽管我努力修复它,但我的算法似乎不起作用。

CODE

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。我最终将其插入到标准化曲线的距离公式中,但我的结果总是错误的。

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

1 个答案:

答案 0 :(得分:0)

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

 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