使用法向量的垂直距离
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
我目前正在编写一个脚本,用于确定从一个点到由两个矢量点创建的直线的最短距离。该脚本将在图形程序中使用以进行贝塞尔曲线裁剪,因此将被执行数千次。
由于这个要求,我试图在两点之间使用一条标准化线,这样计算距离就不会对用户造成太大的负担。我的问题是,尽管我努力修复了算法,但它似乎无法正常工作。
代码
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