我正在编写一个脚本,用于确定从两个矢量点创建的点到线的最短距离。这个脚本将用于图形程序,以便进行贝塞尔剪裁,因此它将被执行数千次。
由于这个要求,我正在尝试利用两点之间的标准化线,这样计算距离就不会对用户造成太大影响。我的问题是,尽管我努力修复它,但我的算法似乎不起作用。
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
答案 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