Python Scipy Delaunay 2D无法连接某些点

axzmvihb  于 2023-10-20  发布在  Python
关注(0)|答案(1)|浏览(139)

我随机生成了20个点,并应用Delaunay三角测量,创建了一个可视化。我不明白为什么外面总有一些点是不相连的。我看了qhull文档,但我找不到可以解决我的问题的设置。我也试过改变种子,但即使使用不同的数字,问题仍然存在。我尝试了scipy.spatial.Delaunay中的选项,比如farthest_site、incremental和qhull_options=“QJ”,但它们没有解决这个问题。

import numpy as np
from scipy.spatial import Delaunay
import matplotlib.pyplot as plt

#The points that I used

np.random.seed(10)  
points = 10 * np.random.rand(20, 2)

#qhull_options = "QJ"

tri = Delaunay(points)


plt.plot(points[:, 0], points[:, 1], 'o', markersize=8, label='Points')

for simplex in tri.simplices:
    plt.plot(points[simplex, 0], points[simplex, 1], 'k-')
    #point1 = points[simplex, 0]
    #point2 = points[simplex, 1]
    #distance = np.linalg.norm(point1 - point2)
    #point_pairs.append((point1, point2))
    #distances.append(distance)
    

plt.xlabel('X')
plt.ylabel('Y')
plt.title('Delaunay Triangulation ')
plt.legend()
plt.axis('equal')  

plt.show()

"""
[[7.71320643 0.20751949]
 [6.33648235 7.48803883]
 [4.98507012 2.24796646]
 [1.98062865 7.60530712]
 [1.69110837 0.88339814]
 [6.85359818 9.53393346]
 [0.03948266 5.12192263]
 [8.12620962 6.12526067]
 [7.21755317 2.91876068]
 [9.17774123 7.14575783]
 [5.42544368 1.42170048]
 [3.7334076  6.74133615]
 [4.41833174 4.34013993]
 [6.17766978 5.13138243]
 [6.50397182 6.01038953]
 [8.05223197 5.21647152]
 [9.08648881 3.19236089]
 [0.90459349 3.00700057]
 [1.13984362 8.28681326]
 [0.46896319 6.26287148]]
"""

'''
von4xj4u

von4xj4u1#

最小示例

from scipy.spatial import Delaunay
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1234)
points=np.random.rand(10,2)

tri=Delaunay(points)

plt.scatter(points[:,0], points[:,1])
for s in tri.simplices:
    plt.plot(points[s,0], points[s,1], 'k-')

plt.show()

它显示:

我很幸运我的种子,因为(不像你的-即使如此,没有吹牛,我也知道你的问题是什么)它让问题变得很明显:底部的那一条线不可能是三角形的一部分(在您的示例中,您似乎只有闭合三角形

只绘制一个三角形

原因是,你的,否则很聪明,画三角形的方法,只是每个三角形画2条线。每个simplex都是一个索引三元组。您可以使用花哨的索引将它们转换为xy的三元组。把这些画出来。但是在matplotlib中,当你绘制3 x和3 y时,你会得到2条线,而不是3条。
只要画出第一个三角形就可以了(我们又很幸运,第一个三角形正好是我们已经注意到的那个)

plt.scatter(points[:,0], points[:,1])
for s in tri.simplices:
    plt.plot(points[s,0], points[s,1], 'k-')
    break

所以,你看,2行(虽然我相信你在这一点上并不需要说服。这是一种错误,有时很难找到,但似乎很明显,一旦看到)。

关闭循环

因此,一个解决方案是使用plt.fill(带有选项fill=False,这可能看起来自相矛盾,因为这意味着填充,但不填充。但fill的作用是闭合循环,在绘图时,并填充内部,除非要求不要)

plt.scatter(points[:,0], points[:,1])
for s in tri.simplices:
    plt.fill(points[s,0], points[s,1], fill=False)

另一种选择是修改所有的s,在末尾添加第一个点

plt.scatter(points[:,0], points[:,1])
for s in tri.simplices:
    t=s.tolist()+[s[0]]
    plt.plot(points[t,0], points[t,1], 'k-')

显示出完全相同的结果
但是fill,如果没有fill=False,也可以很清楚地显示三角形的位置:

for s in tri.simplices:
    plt.fill(points[s,0], points[s,1])
plt.scatter(points[:,0], points[:,1]) # I need to draw the points after, or otherwise they are covered by filled triangles

你的种子

我错过了一个事实,当我在玩我自己的例子时,你编辑了你的帖子来创建一个MRE。现在我可以展示种子x1c4d 1x的情况

相关问题