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

如何提取PyVista中与PolyData对象接触的UnstructuredGrid网格单元

如何提取PyVista中与PolyData对象接触的UnstructuredGrid网格单元

嗨,针对你要提取UnstructuredGrid中仅与闭合PolyData接触的单元这个需求,我整理了两个实用的PyVista实现方案,完全适配你说的“无穿透、仅接触”的场景:


方法一:基于隐式距离的简洁筛选法

这个方法利用闭合PolyData的隐式距离特性,能轻松覆盖点接触、面贴合等所有接触场景,代码也最简洁:

import pyvista as pv
import numpy as np

# 假设你的PolyData实例是poly_data,UnstructuredGrid实例是ugrid
# 为UnstructuredGrid的每个点计算到PolyData的带符号距离(表面处距离为0)
ugrid_with_dist = ugrid.compute_implicit_distance(poly_data, inplace=False)

# 将点的距离数据转换为单元数据,取每个单元内的最小距离
# (只要单元有部分接触PolyData,最小距离就会接近0)
cell_min_dist = ugrid_with_dist.cell_data_from_point_data(
    "implicit_distance", reduction="min"
)

# 考虑浮点计算精度,设置极小的阈值筛选接触单元
distance_threshold = 1e-6
touching_cells = ugrid_with_dist.threshold(cell_min_dist, upper=distance_threshold)

为什么这个方法靠谱?

因为你的PolyData是闭合表面,compute_implicit_distance生成的距离值在表面上严格为0,外部为正(内部为负)。我们取每个单元的最小距离,只要这个值接近0(在阈值内),就说明该单元至少有一部分与PolyData接触,完全符合你的要求。


方法二:基于点+面接触的精准匹配法

如果你的接触场景以共享点或贴合面为主,也可以用这种更直接的匹配方式,分两步覆盖所有接触情况:

import pyvista as pv
import numpy as np

# 假设你的PolyData实例是poly_data,UnstructuredGrid实例是ugrid
touching_cell_ids = []

# 第一步:筛选与PolyData共享点的单元
poly_points = poly_data.points
# 找到UnstructuredGrid中包含这些点的单元ID
point_contact_cell_ids = ugrid.find_cells(poly_points)
touching_cell_ids.extend(point_contact_cell_ids)

# 第二步:筛选与PolyData面贴合的单元(无共享点的情况)
# 先提取UnstructuredGrid的外表面
ugrid_surface = ugrid.extract_surface()
# 计算外表面与PolyData的交线/交点
intersection = ugrid_surface.intersection(poly_data)

if not intersection.is_empty:
    # 找到交线所在的表面单元ID
    surface_intersect_cell_ids = ugrid_surface.find_cells(intersection.points)
    # 映射回原UnstructuredGrid的单元ID
    original_cell_ids = ugrid_surface.cell_data["vtkOriginalCellIds"]
    face_contact_cell_ids = original_cell_ids[surface_intersect_cell_ids]
    touching_cell_ids.extend(face_contact_cell_ids)

# 去重并提取最终的接触单元
unique_touching_cell_ids = np.unique(touching_cell_ids)
touching_cells = ugrid.extract_cells(unique_touching_cell_ids)

适用场景

这个方法更适合你能确定接触方式的场景,比如明确有共享点或者面贴合的情况,针对性更强。


两种方法都能实现你的需求,个人更推荐第一种,因为它代码简洁且能自动覆盖所有接触类型,不需要额外判断接触方式~

备注:内容来源于stack exchange,提问作者Venkatesh B

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.13 18:50:28