如何确定一个点是否在Lua(或其他语言)中的另外两个点之间的一条线上?

时间:2017-04-26 12:38:28

标签: math vector lua 3d

我在两点a和b(3d矢量)和第三点p(来自标量投影)之间有一条线。

我想确定第三个点p是否在a和b之间的线上,或者它们之间是否存在。

LuaJIT最有效的算法是什么?其他语言也可以,但效率很重要

感谢numberZero,我得到了这段代码,似乎可以正常工作

function vec3d:is_between(a, b)
    local ab = b - a
    local ap = self - a
    local lp = ap:len()
    local lb = ab:len()
    local dot = ap:dot(ab) / (lp * lb)
    return lp < lb and dot > 0.95
end

1 个答案:

答案 0 :(得分:2)

如果你已经知道这三个点是共线的,你可以计算从 a p 的矢量 AP 和矢量 AB a b 。如果 p 介于 a b 之间,那么 AP dot product AB 将等于1(即向量指向同一方向), AP vector magnitude将小于 AB

如果您不知道这些点是否是共线,则很容易检查。您可以确定三个点 x i =的共线性  通过实施测试, i = 1,2,3的(x i ,y i ,z i )关于距离的比例:

  

x 2 - x 1 :y 2 - y 1 :z 2 -    z 1 = x 3 - x 1 :y 3 -    y 1 :z 3 - z 1

explained in this Wolfram Mathworld article on Collinearity。从同一篇文章中,一个更容易的条件

  

是通过注意三点确定的三角形区域为零而得到的,如果它们是共线的(包括两个或所有三个点并发的简并情况),即......以扩展形式

     

x 1 (y 2 - y 3 )+ x 2 (y 3 < / sub> -    y 1 )+ x 3 (y 1 - y 2 )= 0.