python - 检查 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 则为假。
解决方案
我在这里把右边当作正面,把左边当作负面:
根据您的金字塔,它由 5 个面定义,因此也可以由 5 个平面定义。平面只是一个平面(没有体积;只有面积)表面。,由等式定义ax + by + cz + d = 0
。但是,要回答您的问题,我们只需要平面的法线,它由上述等式的三个系数给出N = (a, b, c)
。
假设我们使用ACD
了您图像中的平面。我们也可以通过这样的叉积来找到平面的法线:(D - A) x (C - A)
,这给了我们法线,N
。
现在我们还需要一个方向向量,它从我们正在测试的 3D 点指向平面上的任何点。为简化起见,我们可以只使用点之一:A
,C
或D
(让我们使用A
),因为它们仍然被认为是平面的一部分。
像这样:directionVector = point_outside - A
现在我们有了这样的方法:
现在,如果我们取方向向量和法线 ( ) 的点积,float value = directionVector . N
我们只会得到一个数值。
然而,数值的符号告诉我们该点是在内部还是外部(3D 点在平面的哪一侧)。
因此,如果value > 0
,则该点位于金字塔内部(平面右侧),如果value < 0
,则该点位于金字塔外部(平面左侧)。
现在,如果对金字塔的所有其他 4 个平面重复此过程。如果它们都返回正值,则该点确实在金字塔内部。但是,如果其中一个返回负值,则该点位于金字塔外部。
注意 1:确保平面的法线朝向金字塔外而不是内部。
注意2:如果你颠倒了正负边(如果现在左为正,右为负),请确保也反转不等式。
推荐阅读
- javascript - 在窗口和标签面板 ExtJs 中显示相同的面板
- node.js - Mongoose 中的更新问题
- http-status-code-404 - 404 not found error without https:// 当键入 https 时,我认为它工作正常 cloudflare 问题
- reactjs - redux-saga 与 redux 一起使用会导致 render() 被调用两次
- apache-beam - 如何使用 Apache Beam 合并两个流并对合并的流执行有状态操作
- flutter - Bloc 测试中 BehaviourSubject 的断言问题
- ios - UICollectionView 中的选择和取消选择问题
- java - 如何为预期的异常测试方法添加多个案例?
- sql - 所有插入查询的单个存储过程
- php - PHP:始终在 EXCEL 中显示小数位,即使是零