找出一个点属于 scipy.spatial.Delaunay python 的所有单纯形

Find all simplices a point is a part of in scipy.spatial.Delaunay python

有没有办法得到所有 simplices/triangles 某个点是使用 scipy.spatial.Delaunay 的 Delaunay 三角剖分的一部分?

我知道有 find_simplex() 函数,只有 returns 1 个三角形是一个点的一部分,但我想得到它是其中一部分的所有三角形。

所以在示例中,当我对点 6 执行 find_simplex() 时,它只有 return 三角形 2,但我希望它 return 三角形 1、2、 3、4、10 和 9,因为点 6 是所有这些三角形的一部分。

如有任何帮助,我们将不胜感激!

你不需要find_simplex因为它是几何的,不是拓扑的。也就是说,它将一个点视为一个位置而不是三角剖分的一个组成部分:几乎所有点都只位于一个单纯形中,所以这就是它报告的内容。

而是使用顶点 number。简单的答案是使用 simplices 属性:

vert=6
[i for i,s in enumerate(d.simplices) if vert in s]

使用更多代码,可以使用 vertex_to_simplexneighbors 属性更有效地进行搜索。

您可以通过

有效地获得与给定顶点相邻的所有单纯形
def get_simplices(self, vertex):
    "Find all simplices this `vertex` belongs to"
    visited = set()
    queue = [self.vertex_to_simplex[vertex]]
    while queue:
        simplex = queue.pop()
        for i, s in enumerate(self.neighbors[simplex]):
            if self.simplices[simplex][i] != vertex and s != -1 and s not in visited:
                queue.append(s)
        visited.add(simplex)
    return np.array(list(visited))

示例:

import scipy.spatial
import numpy as np
np.random.seed(0)
points = np.random.rand(10, 2)
tri = scipy.spatial.Delaunay(points)
vertex = 2
simplices = get_simplices(tri, vertex)
# 0, 2, 5, 9, 11
neighbors = np.unique(tri.simplices[simplices].reshape(-1)])
# 0, 1, 2, 3, 7, 8

可视化:

import matplotlib.pyplot as plt
plt.triplot(points[:,0], points[:,1], tri.simplices)
plt.plot(points[neighbors,0], points[neighbors,1], 'or')
plt.plot(points[vertex,0], points[vertex,1], 'ob')
plt.show()