如何提取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
相关产品推荐
相关产品推荐

