You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何仅使用坐标判断给定点是否在三角金字塔(四面体)内部

判断点是否在四面体(金字塔)内部的实现方案

核心原理

我们已经实现了2D场景下点是否在三角形内部的判断逻辑,延伸到3D四面体场景下,整个判断过程仅通过坐标即可完成,不需要额外的预处理参数,常用两种可靠方案:

  • 体积比较法:将目标点与四面体的四个顶点组合,拆分出4个小四面体,4个小四面体的体积之和等于原四面体体积时,点在内部
  • 同侧法:四面体的每个面的外法向量指向外部,目标点与面对应的对顶点需在面的同一侧,4个面均满足条件时点在内部

以下为开发门槛更低、逻辑更直观的体积比较法实现:

实现代码(Python)

首先实现计算四面体有向体积的辅助函数,主判断逻辑中添加浮点数误差容限,避免精度问题导致的误判:

def tetrahedron_volume(a, b, c, d):
    # 输入a/b/c/d为四个顶点的三元组坐标,返回四面体有向体积
    return (1/6) * (
        (b[0]-a[0]) * ((c[1]-a[1])*(d[2]-a[2]) - (c[2]-a[2])*(d[1]-a[1]))
        - (b[1]-a[1]) * ((c[0]-a[0])*(d[2]-a[2]) - (c[2]-a[2])*(d[0]-a[0]))
        + (b[2]-a[2]) * ((c[0]-a[0])*(d[1]-a[1]) - (c[1]-a[1])*(d[0]-a[0]))
    )

def point_in_tetrahedron(p, vertices):
    # vertices为四面体四个顶点的列表,顺序无要求
    v0, v1, v2, v3 = vertices
    # 浮点数误差容限,可根据坐标精度调整
    eps = 1e-6
    # 原四面体体积绝对值
    vol_original = abs(tetrahedron_volume(v0, v1, v2, v3))
    # 四个拆分小四面体的体积之和
    vol_sum = (
        abs(tetrahedron_volume(p, v1, v2, v3))
        + abs(tetrahedron_volume(v0, p, v2, v3))
        + abs(tetrahedron_volume(v0, v1, p, v3))
        + abs(tetrahedron_volume(v0, v1, v2, p))
    )
    # 体积差在误差范围内即判定为在内部/边界上
    return abs(vol_sum - vol_original) < eps

如果需要严格区分点在内部/边界/外部,可以调整误差容限eps的判断逻辑,比如当体积差小于-eps时判定为外部,介于±eps之间判定为边界,大于eps判定为外部,按需调整即可。

测试验证

用给出的示例参数测试,输出结果符合预期:

# 示例四面体顶点
tet_vertices = [(0, 0, 0), (3, 1, 4), (1, 4, 2), (6, 3, 5)]
# 测试点1:(1,1,0)
print(point_in_tetrahedron((1,1,0), tet_vertices)) # 输出False
# 测试点2:(1,1,1)
print(point_in_tetrahedron((1,1,1), tet_vertices)) # 输出True

内容的提问来源于stack exchange,提问作者Ali Hakan Kurt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 01:54:00