我有数千个点集,我将其提供给 Scipy的Delaunay 函数以获得相应的三角测量集。
如果我的输入点无效,例如所有点在一条线上或由于其他原因Delaunay三角测量失败,它会在控制台中生成一个非常详细的报告,如下面的报告:
QH6154 qhull精度误差:初始刻面1与内部点共面 ERRONEOUS FACET:
- f1
- flags:bottom simplicial upperDelaunay翻转
- 正常:-0.3162 -0.9487 0
- 抵消:5929262
- 顶点:p4(v2)p3(v1)p0(v0)
- 邻近方面:f2 f3 f4
执行时:| qhull d Qbb Qt Qc Qz
为Qhull 2012.1 2012/02/18选择的选项:
run-id 231396746 delaunay Qbbound-last Qtriangulate Qcoplanar-keep
Qz-infinity-point _pre-merge _zero-centrum Qinterior-keep Pgood
_max-width 33错误 - 舍入5.8e-009 _one-merge 4e-008
可见距离1.2e-008 U-coplanar-distance 1.2e-008
宽度 - 外部2.3e-008 _wide-facet 6.9e-008
qhull的输入似乎小于3维,或者是 计算已经溢出。
Qhull无法从点构造一个明显凸起的单形:
- p1(v3):4.9e + 005 6.1e + 006 0.00016
- p4(v2):4.9e + 005 6.1e + 006 33
- p3(v1):4.9e + 005 6.1e + 006 0
- p0(v0):4.9e + 005 6.1e + 006 0.0009
中心点与小平面共面,或顶点是共面的 与邻近的方面。
的最大舍入误差 计算距离是5.8e-009。中心点,刻面和距离
到中心点如下:
中心点4.9e + 005 6.087e + 006 8.25
facet p4 p3 p0 distance = 0
facet p1 p3 p0 distance = 0
facet p1 p4 p0 distance = 0
facet p1 p4 p3 distance = 0
这些点要么具有最大或最小x坐标,要么具有 他们最大化k坐标的决定因素。试验点
首先从最大化坐标的点中选择。
每个维度的最小和最大坐标为:
0:4.9e + 005 4.9e + 005差= 33 1:6.087e + 006 6.087e + 006差= 11 2:0 33差异= 33
如果输入应该是全尺寸的,那么您有几个选项 可以确定初始单形:
- 使用' QJ'对输入进行点动并使其成为全尺寸的 - 使用' QbB'将点缩放到单位立方体
- 使用' QR0'随机旋转输入以获得不同的最大点
- 使用' Qs'搜索所有点的初始单纯形
- 使用'恩'指定小于5.8e-009的最大舍入误差。
- 使用' T3'跟踪执行看每个点的决定因素。
如果输入的尺寸较小:
- 使用' QJ'对输入进行点动并使其成为全尺寸的 - 使用' Qbk:0Bk:0'从输入中删除坐标k。你应该 选择范围最小的坐标。船体将有 正确的拓扑。
- 确定包含点的平面,旋转点
进入坐标平面,并删除其他坐标。
- 添加一个或多个点以使输入完整。
根据documentation,没有立即选择设置Delaunay(...)
来禁止此报告。我还没有在qhull options的相当长的列表中找到一个选项。
我已尝试过here提供的解决方案,但它似乎规避了这一点。
有没有办法压制这个?
答案 0 :(得分:1)
完全禁止警告的方法是使用标准库中的warnings类。
一种实现,由于您忽略了所有错误而导致所有输出都会被抑制,因此存在风险。您的代码如下:
import warnings
import numpy
from scipy.spatial import Delaunay
#random point set
pts = numpy.random.rand(12,3)
#warnings catch - ignore filter
with warnings.catch_warnings():
warnings.simplefilter("ignore")
try:
#call Delaunay with pts input
out = Delaunay(pts)
except:
#when exception arises set out to False
out = False
请记住,修改警告可能会有所帮助,以便在出现意外情况时至少打印一次特定警告。
答案 1 :(得分:0)
以下代码会抑制大部分打印:
if points.shape[0]>3:
tri = Delaunay(points, qhull_options='Pp')
使用qhull_options='QJ Pp'
将进一步抑制警告,但它也会稍微修改点的原始位置,以避免精确和共面问题。