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

我有两个点 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
点赞
用户3455883
用户3455883

如果你已经知道这三个点共线,你可以计算向量 APap 和向量 ABab。如果 pab 之间,那么 APAB点积将等于1(即向量指向相同方向),而 AP向量大小将小于 AB 的大小。

如果你不知道这些点是否共线,也很容易检查。你可以通过实现一个测试距离比例来确定三个点 x i = (xi, yi, zi) 的共线性,其中 i = 1,2,3:

x2 - x1 : y2 - y1 : z2 - z1 = x3 - x1 : y3 - y1 : z3 - z1。

就像这篇关于共线性的 Wolfram Mathworld 文章 中所解释的那样。从同一篇文章中,一个更简单的条件

通过观察确定由三个点确定的三角形的面积是否为零来获得,如果是,则它们共线(包括两个或三个点重合的退化情况)。即...

x1( y2 - y3 ) + x2( y3 - y1) + x3( y1 - y2 ) = 0\。

2017-04-26 12:47:31
用户6368531
用户6368531

如果你知道这些点在同一条直线上,你可以只计算一个点积,如果 _0 ≤ 〈AB, AP〉 ≤ 〈AB, AB〉_,那么 P 就在 AB 之间。但注意,如果 P 不恰好在直线上,这个方法可能会给出奇怪的结果。但这应该是最快的方法。

你也可以计算两个值,PAB 的距离和(正交的)AP 投影到 AB 上。后者为 _AP_AB = 〈AP, AB〉/〈AB, AB〉_(在 AB 单位上,所以如果 APAB 共线,_AP = AB * AP_AB_),前者为 _ρ(P, AB) = ρ(AP, AB * AP_AB) = |AP - AB * AP_AB|_。所以,如果 ρ(P, AB) 很小,你可以决定如果 _0 ≤ AP_AB ≤ 1_,那么 P 就在 AB 之间。

2017-05-07 22:44:06