四面体的交点

问题描述

我希望尽可能清楚。 我正在尝试实现给定两个四面体的函数,以检查它们是否相交。 我正在使用python,并且我正在使用的唯一库是NumPy。 为了描述四面体,我使用其四个顶点,每个顶点由坐标[x,y,z]描述。

vertex = [x,y,z]

tetrahedra = [vertex 1,vertex 2,vertex 3,vertex 4]

这是我要使用的理由:

  • 四面体不过是由不等式定义的区域。
  • 这些不等式由包含四面体一个面的平面描述。
  • 因此,考虑到两个四面体的不等式,并将它们放在一个系统中,如果该系统允许 解决方案,然后有一个交集。

这是我的功能

def IsInterpenetrated(self,tetrahedra):
    A= []
    B= []
    sol= 0
    for tr in [self,tetrahedra]:
        print("Plane of tetrahedra")
        vertexList = tr.vertices
        i=0
        while i<4:
            if handedness(vertexList)>0:
                n= numpy.cross(vertexList[1].coords - vertexList[0].coords,vertexList[2].coords - vertexList[0].coords)
            else:
                n= numpy.cross(vertexList[2].coords - vertexList[0].coords,vertexList[1].coords - vertexList[0].coords)
            
            p0= vertexList[0].coords
            d= -(n[0]*p0[0] + n[1]*p0[1] + n[2]*p0[2])
            
            print("normal: ",n,end="      ")
            print("termine noto: ",(d))

            if len(A) > 3:
                j=0
                while j<=3:
                    if numpy.all(-n == A[j]) and -d == B[j]:
                        sol = 1
                    j= j+1

            A.append(n)
            B.append(d)

            p0= vertexList[0]
            vertexList[0] = vertexList[1]
            vertexList[1] = vertexList[2]
            vertexList[2] = vertexList[3]
            vertexList[3] = p0

            i=i+1

    A= numpy.array(A)
    B= numpy.array(B)
    print("\n")

    print("disequazioni:\n")
    i=0
    for n in A:
        print("({0})x + ({1})y + ({2})z + ({3}) > 0".format(n[0],n[1],n[2],B[i]))
        i=i+1
    print("\n")

    x = cvxpy.Variable(3)
    prob = cvxpy.Problem(cvxpy.Minimize(0),[A @ x + B >= 0])
    prob.solve()
    if prob.value == 0 and sol != 1:
        return 1
    return 0

在这种情况下,我已经使用cvxpy解决了不等式系统,并且已经验证了两个四面体具有相同面的特殊情况。 我想知道您是否认为以下推理正确,以避免使用不平等系统。 标识四面体面的每个平面都属于以下列方式描述的平行平面束族: ax + by + cz + k = 0其中,k是表示平面在空间上的精确位置的术语。然后我可以通过以下方式描述四面体:

System:
a'x + b'y + c'z = k '
a "x + b" y + c "z = k"
a '"x + b'" y + c '"z = k'"
a "" x + b "" y + c "" z = k ""
其中k是d,其中d是识别人脸的平面的已知项。 多亏了Rouché-Capelli theorem ,我知道如果Rg(A)= Rg(A | B),则该系统可以接受解,其中Rg代表rank。为了确保尊重这种平等,则Det(A | B)= 0,其中Det代表determinant。由于在我的情况下B由变量组成:
(k ',k ",k"',......,kᵐ)

然后使Det(A | B)= 0,我必须求解由该计算创建的方程。对两个四面体都进行了这种推理后,我发现自己有两个方程组,其中三个未知数。每个四面体一个。通过将这两个方程式放入系统中,我必须查看它接受k的哪个值。如果有k值被系统尊重,那么我有交集,否则就没有。 我不知道这有多可行,但我希望分享我的想法,以便一起讨论。

谢谢。

解决方法

为什么不使用凸出的平面不等式来表达凸优化问题,或者不精确地解决可行性问题呢?假设两个四面体可以表示为A1.X + d1 <= 0A2.X + d2 <= 0,其中A1A2的4行存储着四个{ a,b,c中的两个四面体以及列向量ax + by + cz + d <= 0d1存储常数,即d2。另外请注意,d是矩阵乘法。

A1.X表示为向量(x,y,z)

现在基本上,您想像这样解决X的可行性问题:

X

请注意,如果求解器返回minimize 0 subject to A1.X + d1 <= 0 A2.X + d2 <= 0 ,则意味着没有inf可以满足上述约束。如果求解器返回X(这是常数目标函数的值),则意味着至少有一个0满足约束。

您可以为此使用X库。这是一个不错的tutorialcvxpy库也很适合cvxpy

在这种情况下,我认为解决方程并不可行,因为四面体基本上由四个线性不等式组成。因此,您必须解决不等式以便在其相交区域内找到解决方案。