1

如何确定两条 3D 线段是否与每条线的起点和终点的给定 XYZ 坐标相交?如果它们确实相交,那么 XYZ 是什么?

我只能找到二维线的答案:如何检测两条线段相交的位置?

4

1 回答 1

6

让我们的起点是P0,Q0,终点是P1,Q1。

Direction vectors
DP = P1 - P0
DQ = Q1 - Q0
start difference vector
PQ = Q0 - P0

参数形式的分段:

P = P0 + t * DP
Q = Q0 + u * DQ

查找值

a = Dot(DP, DP)
b = Dot(DP, DQ)
c = Dot(DQ, DQ)
d = Dot(DP, PQ)
e = Dot(DQ, PQ)

找到判别式

DD = a * c- b * b

如果 DD = 0,则线段是平行的,并考虑(部分)重合的特殊情况,否则

查找线上最近点的参数

tt = (b * e - c * d) / DD
uu = (a * e - b * d) / DD

如果任何参数超出范围 0..1,则段不相交,否则

查找点之间的距离

 P(tt) = P0 + tt * DP
 Q(uu) = Q0 + uu * DQ
 Dist = Length(Q(uu) - P(tt))

如果 Dist 为零(或由于数值错误而小于某个小的 Epsilon 值,例如 1.0E-12),则段相交于该点 P(tt)

于 2016-01-05T05:12:23.423 回答