线段和三角形之间的 3d 交集
3d intersection between segment and triangle
网络上的一切都太复杂了。
所以,我有一个由三个点组成的数组定义的三角形,以及由 2 个点定义的线段。点 = 3 个浮点数。我想知道它们是否相交。交点也会有帮助,但不是那么多。
我有这样的东西:
和每种情况下的 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]]
我给你一个数学公式:
所有三角形都必须有方向。方向由三角形顶点的顺序或等效的三角形法线给出。我假设三角形顶点是逆时针顺序 (CCW) 中的 p1、p2 和 p3。
三角形法线 N 为:
N = (p2 - p1) × (p3 - p1)
其中×表示"cross product"。然后为每个三角形边创建一个法向量:
N12 = (p2 - p1) × N
N23 = (p3 - p2) × N
N31 = (p1 - p3) × N
边法线是三角形平面中的向量,但与三角形边正交。侧法线对于计算点和线之间的距离很有用。
例如,给定一个位于三角形平面上的点 "p",从 p 到通过点 p1 和 p2 的直线的最小距离为:
Dist = ((p - p1) • N12) / |N12|
• 表示 "dot product" 和 |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)
当t的值为:
时,线段R(t)与平面相交
t = - (D + N • s1) / (N • (s2 - s1))
用那个 t 你可以计算直线和平面的交点。有了那个点并使用侧法线,您可以知道交点是否在三角形内。
网络上的一切都太复杂了。
所以,我有一个由三个点组成的数组定义的三角形,以及由 2 个点定义的线段。点 = 3 个浮点数。我想知道它们是否相交。交点也会有帮助,但不是那么多。
我有这样的东西:
和每种情况下的 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]]
我给你一个数学公式:
所有三角形都必须有方向。方向由三角形顶点的顺序或等效的三角形法线给出。我假设三角形顶点是逆时针顺序 (CCW) 中的 p1、p2 和 p3。
三角形法线 N 为:
N = (p2 - p1) × (p3 - p1)
其中×表示"cross product"。然后为每个三角形边创建一个法向量:
N12 = (p2 - p1) × N
N23 = (p3 - p2) × N
N31 = (p1 - p3) × N
边法线是三角形平面中的向量,但与三角形边正交。侧法线对于计算点和线之间的距离很有用。
例如,给定一个位于三角形平面上的点 "p",从 p 到通过点 p1 和 p2 的直线的最小距离为:
Dist = ((p - p1) • N12) / |N12|
• 表示 "dot product" 和 |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)
当t的值为:
时,线段R(t)与平面相交t = - (D + N • s1) / (N • (s2 - s1))
用那个 t 你可以计算直线和平面的交点。有了那个点并使用侧法线,您可以知道交点是否在三角形内。