我在两点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
答案 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.