如何使用scipy.spatial.Delaunay生成无误差的三角网格包含所有点?

4

我正在测试 scipy.spatial.Delaunay,但是遇到了两个问题:

  1. 网格存在错误
  2. 网格未包含所有点

以下是代码和绘图:

import numpy as np
from scipy.spatial import Delaunay,delaunay_plot_2d
import matplotlib.pyplot as plt    
#input_xyz.txt contains 1000 pts in "X Y Z" (float numbers) format
points = np.loadtxt("input_xyz.txt", delimiter=" ", usecols=(0, 1))
tri = Delaunay(points)
delaunay_plot_2d(tri)
plt.plot(points[:,0], points[:,1], 'o')
plt.show()

enter image description here

正如在scipy.spatial.Delaunay中所提到的:

"除非您传递Qhull选项“QJ”,否则Qhull无法保证每个输入点都出现为Delaunay三角剖分中的顶点。"

但是如果我使用QJ:

tri = Delaunay(points, qhull_options = "QJ")

我遇到了Qhull错误,如果我使用QJn(其中n是一个较大的数字):
tri = Delaunay(points, qhull_options = "QJ200")

为了克服该错误,生成的网格看起来很糟糕 - 三角形到处都是,相互交叉。
如何使用scipy.spatial.Delaunay在无误差的三角剖分网格中包含所有点?

请澄清您的具体问题或添加其他细节,以准确突出您所需的内容。目前的描述不够清晰,很难确定您的问题所在。请参阅如何提问页面以获取帮助来澄清此问题。这个也会有所帮助。 - kylieCatt
@IanAuld 抱歉,我认为这很清楚,我需要找到合适的参数(如果可能的话)来运行scipy.spatial.Delaunay,以便每个输入点都出现在Delaunay三角剖分中,并且三角形不会相互交叉。当默认情况下运行scipy.spatial.Delaunay时,它存在这两个问题。 - Miro
我看到你没有阅读我发布的链接。一个适当的SO问题会有一个最小、完整和可验证的示例。如果我们看不到你正在使用的输入、你编写的代码以及你期望的输出,我们怎么能帮助你呢? - kylieCatt
@IanAuld 谢谢你的建议,现在好了吗? - Miro
1个回答

5
问题在于您的数据集没有被居中。Qhull(用于进行Delaunay三角剖分)不会在默认选项下为您居中数据集,因此它会产生远离原点的舍入误差。
您可以在三角剖分之前自己将其居中。
points -= points.mean(axis=0)
tri = Delaunay(points)

哇,它运行得非常好。我从来没有想到这可能是个问题。您能否详细解释一下居中数据集的代码行实际上是做什么的? - Miro
哦,我现在明白了,它是将数据集居中到原点。 - Miro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接