SciPy Delaunay三角剖分参数微幅变动时单形多顶点变更问题
问题原因
规则网格点集存在大量共超球的退化点组,d维空间中只要存在d+2个点共超球,就存在多种合法的Delaunay三角剖分结果。默认QHull实现会按照内部优先级选择其中一种剖分方式,这种选择不会保证相邻单形共享d个顶点(即单形切换时仅替换1个顶点),当查询点落在退化的超平面上时,两侧的单形可能只有少量公共顶点,就是你观察到的现象。这是退化场景下Delaunay三角剖分的固有特性,不是实现bug。
可行解决方案
- 直接使用QHull的
Qx选项:该选项专门用于处理共点、共面等退化场景,会强制调整剖分逻辑保证邻接单形的面共享关系符合预期。你观察到维度>4时SciPy默认开启该选项,实际上对于3/4维规则网格场景也可以手动开启,全局适用,调用时修改代码为:
该方案无需修改其他逻辑,即可解决你给出的3维、4维示例中的异常。tri = Delaunay(X, qhull_options="Qx") - 使用规则网格结构化剖分:你使用的是轴对齐规则网格,不需要调用通用Delaunay实现,可自行实现超立方体的固定剖分逻辑:先定位查询点所在的网格超立方体,再将超立方体按固定规则(如按坐标偏移量排序)拆分为d!个单形。这种方案的剖分结果完全可控,单形切换时必然仅替换1个顶点,且性能远高于通用Delaunay剖分,适合规则网格场景。
- 给网格点加微小扰动:给每个网格点的各坐标加1e-12量级的随机噪声,破坏共超球的退化条件,此时Delaunay剖分结果唯一,邻接关系也会符合预期。该方案适合无法修改剖分逻辑的场景,扰动大小远低于你使用的查询delta,不会对插值结果产生可感知的影响。
内容的提问来源于stack exchange,提问作者Warrick
相关产品推荐
相关产品推荐

