如果线段在空间中与三角形相交

问题描述 投票:0回答:2

在去国旗并将其标记为傻瓜之前,请承认我有轻微的c++经验,并且我不完全理解有关matrices或更高级数学的一些问题的答案。

我有3个点定义的三角形,A(0,0,0),B(1,0,0),C(0,1,1)

我有一个由2个点定义的线段,D(0,1 / 2,0)和E(1,1 / 2,1)

现在,关于第一个链接,我理解如果四个ABCD的体积= 0或四个ABCE = 0,则三角形面内有一个点。但是当提到负数量时:

这是解决问题的一种方法。计算四面体的体积Td =(a,b,c,d)和Te =(a,b,c,e)。如果Td或Te的任一体积为零,则段de的一个端点位于包含三角形(a,b,c)的平面上。如果Td和Te的体积具有相同的符号,则de严格地位于一侧,并且没有交叉点。如果Td和Te具有相反的符号,则de穿过包含(a,b,c)的平面。

如何成交量为负数?我错过了什么吗?

我有一个2d三角形的代码,但我找不到任何在线的三维三角形,这是可以理解/容易翻译成代码,

def areaOfTri(x1, y1, x2, y2, x3, y3): 
    return abs((x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2.0) 


def pointIn2dTri(x1, y1, x2, y2, x3, y3, x, y): 
    # Calculate area of triangle ABC 
    A = areaOfTri (x1, y1, x2, y2, x3, y3)

    # Calculate area of triangle PBC  
    A1 = areaOfTri (x, y, x2, y2, x3, y3) 

    # Calculate area of triangle PAC
    A2 = areaOfTri (x1, y1, x, y, x3, y3) 

    # Calculate area of triangle PAB  
    A3 = areaOfTri (x1, y1, x2, y2, x, y) 

    # Check if sum of A1, A2 and A3  
    # is same as A 
    if(A == A1 + A2 + A3): 
        return True
    else: 
        return False

我发现一些随机链接:hereherehere

python 3d geometry
2个回答
0
投票

在这种情况下,该线穿过包含(a, b, c)的平面。

证明:

abcd = np.array([[0, 0, 0, 1],
                 [1, 0, 0, 1],
                 [0, 1, 1, 1],
                 [0, 0.5, 0, 1]])

abce = np.array([[0, 0, 0, 1],
                 [1, 0, 0, 1],
                 [0, 1, 1, 1],
                 [1, 0.5, 1, 1]])

print(np.sign(np.linalg.det(abcd)))
print(np.sign(np.linalg.det(abce)))

输出:

1.0
-1.0

负面卷的解释可能不是本网站的主题,但请参阅this answer

简而言之,向量有一个方向,表示你来自哪里与你去的地方,用他们的标志来表示。

我们可以通过识别某个卷由某些向量限定来扩展该卷,这些向量本身具有方向。


0
投票

让段由参数方程描述

P(t) = D + (E-D)*t

和三角形定义了它的平面中的双参数坐标系

F(u,v) = A + u*(B-A) + v*(C-A)

制作属于该平面的分段点的三个线性方程组

D.X + (E.X - D.X) * t  = A.X + u*(B.X-A.X) + v*(C.X-A.X)
similar for y,z

为未知的t,u,v解决它(用NumPy应该很容易)。

如果存在解决方案,则段确实与三角形相交

t is in range 0..1
u ~ 0..1
v ~ 0..1
u+v ~ 0..1

在成功的情况下,将t替换为第一个方程以获得交点

© www.soinside.com 2019 - 2024. All rights reserved.