线段和三角形之间的3d相交

时间:2019-01-11 08:54:38

标签: python 3d line polygon segment

网络上的一切都太复杂了。

所以,我有一个由三个点的数组定义的三角形,以及由两个点定义的段。点= 3个浮点数。我想知道它们是否相交。同样,交叉点会有所帮助,但效果不大。

我有这样的事情: made in blender 2.78

和每种情况下的5个坐标(15个浮点数)。我只需要python代码或数学公式,并希望一些入门信息。

关于python,请使用以下代码开始代码:

plane = [[float(input('plane coord1 x:'), float(input('plane coord1 y:'), float(input('plane coord1 z:')], [float(input('plane coord2 x:'), float(input('plane coord2 y:'), float(input('plane coord2 z:')], [float(input('plane coord3 x:'), float(input('plane coord3 y:'), float(input('plane coord3 z:')]]
line = [[float(input('line coord1 x:'), float(input('line coord1 y:'), float(input('line coord1 z:')], [float(input('line coord2 x:'), float(input('line coord2 y:'), float(input('line coord2 z:')]]

或者这个:

plane = [[x1,y1,z1], [x2,y2,z2], [x3,y3,z3]]
line = [[X1,Y1,Z1], [X2,Y2,Z2]]

但是请不要使用INTROS !!! 对不起,我的英语。

1 个答案:

答案 0 :(得分:1)

我会给你一个数学公式:

所有三角形必须具有方向。方向由三角形顶点的顺序给出,或者等效地由三角形法线给出。我假设三角形顶点分别为逆时钟明智顺序(CCW),分别为p1,p2和p3。

三角形法向N为:

N = (p2 - p1) × (p3 - p1)

其中×表示“叉积”。然后为每个三角形边创建一个法线向量:

N12 = (p2 - p1) × N
N23 = (p3 - p2) × N
N31 = (p1 - p3) × N

法线侧面是三角形平面中的矢量,但与三角形侧面正交。侧面法线对于计算点与线之间的距离很有用。

例如,给定点“ p”位于三角形的平面上,到通过点p1和p2的线的最小距离fom p为:

Dist = ((p - p1) • N12) / |N12|

•表示“点积”和| N12 |。是常态的常态。

侧法线指向三角形的外部。距离Dist =((p-p1)•N12)/ | N12 |如果该点在三角形之外,则将为正。如果从p到三角形边的所有三个距离均为负,则该点位于三角形内部。

位于三角形平面中的点p是直线和三角形平面的交点。点s1和s2的线段可以用这样的函数表示:

R(t) = s1 + t (s2 - s1)

其中t是从0到1的实数。

三角形的平面由单位法线N和到原点的距离D定义。所以平面方程为:

N • x + D = 0

其中x是满足方程式的任何3D点。到原点D的距离可以使用三角形的任意点进行计算,例如:

D = -(N • p1)

线段R(t)与平面的交点发生在t的值为:

t = - (D + N • s1) / (N • (s2 - s1))

使用该t可以计算线和平面的交点。有了该点并使用侧面法线,您可以知道相交点是否在三角通道内。

相关问题