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

时间:2019-04-11 00:27:27

标签: python 3d geometry

在转到 flag 并将其标记为“欺骗”之前,请承认我有c++的经验,并且我不完全理解有关{{ 3}}或更高级别的数学。

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

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

现在,对于第一个链接,我了解到,如果tetra ABCD = 0或tetra 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 三角形的代码,但是我无法在线找到 3d 三角形的任何内容,可以理解/容易将其翻译为代码,

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

我发现了一些随机链接:matricesherehere

2 个答案:

答案 0 :(得分: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

简而言之,向量的方向代表着您来自何方和去向,以其符号表示。

我们可以通过认识到某个体积被某些矢量所限制,而这些矢量本身具有方向,从而可以将该概念扩展到体积上。

答案 1 :(得分: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代入第一个方程以获得交点