python - scipy.spatial.Delaunay 很难找到给定点的所有邻居

标签 python scipy nearest-neighbor voronoi

这里有一个关于使用 scipy.spatial.Delaunay 查找点中点的最近邻的非常好的讨论: How to find all neighbors of a given point in a delaunay triangulation using scipy.spatial.Delaunay?

我遵循了答案,但是当配置的对称性很高时我遇到了困难。这是我的代码:

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

##########################################################

# Gets a Delaunay triangulations and returns the 
# nearest neighbor points for each point

def find_neighbors(tri):    
    l = tri.vertex_neighbor_vertices
    neib = []
    for i in range(len(l[0])-1):
        neib.append(list(l[1][l[0][i]:l[0][i+1]]))
    return neib

# Create a square lattice
t1 = np.array([1,0])
t2 = np.array([0,1])
n = 6
lattice = np.zeros((n**2,2))
for i in range(n):
    for j in range(n):
        lattice[i*n + j] = i* t1 + j * t2


tri = Delaunay(lattice)
Neib = find_neighbors (tri)

pindex = 20
plt.title("particle index: 20")
plt.triplot(lattice[:,0], lattice[:,1], tri.simplices.copy(),"c--")
plt.plot(lattice[:,0], lattice[:,1], 'go')
plt.plot(lattice[pindex,0], lattice[pindex,1], 'bo')
plt.plot([lattice[i,0] for i in Neib[pindex]],[lattice[i,1] for i in Neib[pindex]], 'ro')
plt.show()

pindex = 21
plt.title("particle index: 21")
plt.triplot(lattice[:,0], lattice[:,1], tri.simplices.copy(),"c--")
plt.plot(lattice[:,0], lattice[:,1], 'go')
plt.plot(lattice[pindex,0], lattice[pindex,1], 'bo')
plt.plot([lattice[i,0] for i in Neib[pindex]], [lattice[i,1] for i in Neib[pindex]], 'ro')
plt.show()

from scipy.spatial import Voronoi, voronoi_plot_2d

vor = Voronoi(lattice)
fig = voronoi_plot_2d(vor)
plt.show()

结果如下。正如您所看到的,对于具有相同对称性的两个点,由于 scipy 进行 Delaunay 三角剖分的方式,我得到了不同数量的邻居。 python 中是否有任何代码可以通过 scipy.spatial.Voronoi 获取邻居?感谢您的帮助。

这是图像的链接。我的声誉低于 10,现在无法发布图片。 (或者,您可以运行代码以获得相同的结果)

索引 20

https://i.ibb.co/9bQQqmT/download.png

索引 21

https://i.ibb.co/pfw5hsG/download-1.png

Voronoi 图

https://i.ibb.co/g3NpjVL/download-2.png

最佳答案

这些对称配置的问题在于 Delaunay 三角剖分不是唯一定义的:只要公共(public)圆上有四个顶点,Voronoi 图就不会指定如何对其进行三角剖分。因此,相反的点在三角剖分中可能相连,也可能不相连。

这是一张夸张的 Voronoi 图,其中 Voronoi 图中的零长度边被夸大了。

enter image description here

Voronoi 图中的红色圆圈边实际上是零长度,可能会也可能不会实际出现并对应于 Delaunay 三角剖分中的一条边。

您可能只想忽略与这些退化 Voronoi 边关联的邻居(以便所有顶点的邻居都是 your image here 中的邻居)。然而,scipy .spatial.Voronoi 并没有让这变得非常容易:您可以找到短的 Voronoi 边,但找不到相应的相邻 Voronoi 站点。在 Delaunay 三角剖分中,您可以查看连接到一条边的两个三角形:在这两个三角形之间有四个顶点。如果所有四个顶点都是共圆的(或非常接近共圆的),则关联的 Voronoi 边是退化的,并且可以忽略该邻居。

关于python - scipy.spatial.Delaunay 很难找到给定点的所有邻居,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57455161/

相关文章:

python - 通过 POST 请求发送二进制图像

python - BeautifulSoup 页码

arrays - 使用 SciPy 读取 MATLAB MAT 文件时出现 "Expecting miMATRIX type"错误

c++ - 不使用OpenCV函数在C++中旋转图像

python - 生成 'K' 数据点的最近邻

Python Pandas Cumprod 问题

python - 如果数据有缺失值,则 scipy.mstats.theilslopes 置信限度错误

python - 如何使用 scipy 获得非平滑的 2D 样条插值

algorithm - 反向多重索引

python - 用 Python 解析