首页 > 解决方案 > 检查 3D 点是否在基于正方形的金字塔中

问题描述

如果我有一个基于正方形的金字塔,我知道每个点(全部 5 个),那么确定给定点是否在该金字塔内的算法是什么?我在这里看到了一个类似的问题Algorithm for checks if 3D point inside convex polyhedron (square pyramid) and here How to check if the point is in the tetrahedron or not? . 那里给出的答案并没有真正的帮助,数学对我来说也没有用。我已经看到了为每个平面创建法线(4 个三角形 + 1 个正方形)并检查点位于平面的哪一侧的方法……但是我不知道正确的数学方法。

如果有人可以帮助我计算数学/算法(最好有解释),那真的很有帮助。

可视化

示例输入:

# Pyarmid Points
A = np.array([2, 2, 4]) # pyramid top
B = np.array([1, 1, 1]) 
C = np.array([1, 3, 3])
D = np.array([3, 3, 1])
E = np.array([3, 1, 1])

# Example points
point_inside = np.array([2, 2, 2])
point_outside = np.array([3, 3, 3])

示例期望:

def check_point_in_pyramid(A, B, C, D, E, Point):

    # math...
    
    if point_inside_pyramid:

        return true


    return false

所以对于 point_inside 函数返回为真,而对于 point_outside 则为假。

标签: pythonmath3dcoordinates

解决方案


我在这里把右边当作正面,把左边当作负面

根据您的金字塔,它由 5 个面定义,因此也可以由 5 个平面定义。平面只是一个平面(没有体积;只有面积)表面。,由等式定义ax + by + cz + d = 0。但是,要回答您的问题,我们只需要平面的法线,它由上述等式的三个系数给出N = (a, b, c)

假设我们使用ACD了您图像中的平面。我们也可以通过这样的叉积来找到平面的法线:(D - A) x (C - A),这给了我们法线,N

现在我们还需要一个方向向量,它从我们正在测试的 3D 点指向平面上的任何点。为简化起见,我们可以只使用点之一:ACD(让我们使用A),因为它们仍然被认为是平面的一部分。

像这样:directionVector = point_outside - A

现在我们有了这样的方法:

这里

现在,如果我们取方向向量和法线 ( ) 的点积,float value = directionVector . N我们只会得到一个数值。

然而,数值的符号告诉我们该点是在内部还是外部(3D 点在平面的哪一侧)。

因此,如果value > 0,则该点位于金字塔内部(平面右侧),如果value < 0,则该点位于金字塔外部(平面左侧)。

现在,如果对金字塔的所有其他 4 个平面重复此过程。如果它们都返回正值,则该点确实在金字塔内部。但是,如果其中一个返回负值,则该点位于金字塔外部

注意 1:确保平面的法线朝向金字塔外而不是内部。

注意2:如果你颠倒了正负边(如果现在左为正,右为负),请确保也反转不等式。


推荐阅读