【问题标题】:3d intersection between segment and triangle线段和三角形之间的 3d 交点
【发布时间】:2019-06-06 04:13:52
【问题描述】:

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

所以,我有一个由三个点组成的数组定义的三角形和一个由 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]]

【问题讨论】:

  • 您可以计算线平面交点,然后查看该点是否包含在您的线段和三角形中。
  • 如何计算?如何查看它是否被三角形包含?非常感谢,但我完全是菜鸟。
  • 如何计算?如何查看它是否被三角形包含?非常感谢,但我完全是菜鸟
  • 关于交点:我发现了这个:youtu.be/qVvvy5hsQwk 另外,您可以通过查看它是否同时属于从x,y和z的三角形正交投影来检查它是否属于三角形(但我还是不知道怎么弄)
  • 另外,mathutils.geometry 能够找到交点。也许,不是最好的解决方案,但仍然......

标签: python 3d line polygon segment


【解决方案1】:

我给你一个数学公式:

所有三角形都必须有一个方向。方向由三角形顶点的顺序或等效的三角形法线给出。我假设三角形顶点是按逆时针顺序 (CCW) 的 p1、p2 和 p3。

三角形法线N为:

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

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

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

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

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

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)

当t有值时,线段R(t)与平面相交:

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

使用 t 可以计算直线和平面的交点。有了那个点并使用边法线,您就可以知道交点是否在三角形内部。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2018-05-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2011-09-26
    相关资源
    最近更新 更多