3

我有数千个点集,我将它们提供给Scipy 的 Delaunay函数以获得一组相应的三角剖分。

如果我的输入点无效,例如。一条线上的所有点或由于某些其他原因,Delaunay 三角剖分失败,它会在控制台中生成一个非常详细的报告,如下面的报告:

QH6154 qhull 精度错误:初始面 1 与内部点共面
ERRONEOUS FACET:
- f1
- 标志:底部简单的 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 Error- roundoff 5.8e-009 _one-merge 4e-008
Visible-distance 1.2e-008 U-coplanar-distance 1.2e-008
Width-outside 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

刻面 p4 p3 p0 距离= 0
刻面 p1 p3 p0 距离= 0
刻面 p1 p4 p0 距离= 0
刻面 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' 搜索所有点对于初始单纯形
- 使用“En”指定小于 5.8e-009 的最大舍入误差。
- 使用“T3”跟踪执行以查看每个点的行列式。

如果输入是低维的:
- 使用“QJ”来调整输入并使其全维
- 使用 'Qbk:0Bk:0' 从输入中删除坐标 k。您应该
选择范围最小的坐标。船体将具有
正确的拓扑结构。
- 确定包含点的平面,将点旋转
到坐标平面中,并删除其他坐标。
- 添加一个或多个点以使输入全维度。

根据文档,没有立即选项可以设置Delaunay(...)呼叫以禁止此报告。在相当长的qhull选项列表中,我也没有找到一个选项。

我已经尝试过这里提供的解决方案,但它似乎绕过了它。

有什么办法可以抑制这种情况吗?

4

2 回答 2

1

完全抑制警告的一种方法是使用标准库中的警告类。

一个实现,这是有风险的,因为您忽略了所有错误,这将抑制所有输出。您的代码如下所示:

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

请记住,修改警告可能是有益的,以便在出现意外情况时至少打印一次特定警告。

于 2016-05-10T16:07:03.520 回答
0

以下代码抑制了大部分打印:

if points.shape[0]>3:
    tri = Delaunay(points, qhull_options='Pp')

usingqhull_options='QJ Pp'将进一步抑制警告,但它也会稍微修改点的原始位置以避免精度和共面性问题。

于 2016-10-31T22:32:22.363 回答