如何检查一个点是否在3D直线上?

5

我知道如何检查一个点是否在二维线上,但我想在三维中做到这一点。有什么想法吗?

        // slope from point 1 to point 3
        var p13:Number = (Math.atan2 (end.x - start.x, end.y - start.y)) * toDegrees;

        // slope from point 1 to point 2 -- matches?
        var p12:Number = (Math.atan2 (point.x - start.x, point.y - start.y)) * toDegrees;

        return Math.round(p12) == Math.round(p13);

认为这个问题在这里被问到了:https://dev59.com/pHRB5IYBdhLWcg3wpYmo - Joseph Le Brech
从算法的角度来看,这应该在Math SE 上,尽管可能已经有人回答了这个问题。 - zzzzBov
3个回答

6

对向量进行归一化处理。检查法线是否匹配。

找到最大值,将所有其他值除以该值,以便获得向量的法线。

线上的任何点都应具有相同的向量法线。


3

在实际坐标中,一个点永远不能“在”一条直线上。你需要做的是计算到最接近该直线的点的距离,并决定这是否足够接近。

相关链接:计算到直线最近点


1
-1 - 非常冗长和复杂的解决方案。完全没有必要。请查看Xaade的答案。 - Robin Rodricks
2
这里有一个更好的公式:http://mathworld.wolfram.com/Point-LineDistance3-Dimensional.html。这个解决方案很好,因为你不需要担心特殊情况,而且你的“容差”可以是距离而不是角度。 - Tom Sirgedas
@Jenko - 比较法线的问题在于到直线的距离与沿着直线的距离成比例。 - Martin Beckett
1
很抱歉我之前表述不够清晰!如果您正在使用线的标准化斜率和斜率(点 - 线起始),那么如果该点靠近原点,那么斜率1%的误差仍然接近于该线,但是如果您沿着该线1000公里,则斜率1%的差异可能会偏离很远。 - Martin Beckett
@Robinicks,我想补充一下,我在寻找“Xaade”的答案时没有找到。经过一番搜索,我发现了我所期望的答案,它来自于“Lee Louviere”,他们改变了他们的名字。我认为这些信息可能对未来的读者有所帮助。 - Ela782

0

一条直线的方程为

v(t) = v0 + t*dir

其中v0是直线上的某个点,dir是它的方向。只需检查您的点是否与这条线性方程足够精确地匹配即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接