找到一个点是scipy.spatial.Delaunay python中的一部分的所有单纯形

时间:2018-05-24 20:38:19

标签: python scipy graph-theory discrete-mathematics delaunay

无论如何,使用const axios = require("axios"); const moment = require("moment"); const { promisify } = require("util"); const orderbookQueue = []; const orderbookUpdateTime = {}; async function requestOrderbook(pair) { const response = await axios.post("https://api.kraken.com/0/public/Depth", { pair }); orderbookUpdateTime[pair] = +moment(); return response.data.result[pair]; } async function getOrderbook(pair, currentTime) { if ( orderbookUpdateTime[pair] && currentTime - orderbookUpdateTime[pair] > 60000 ) { const requestOrderbookAsync = promisify(requestOrderbook); orderbookQueue.push(() => requestOrderbookAsync(pair)); // how to I return the result of requestOrderbookAsync when it has been called ? } return requestOrderbook(pair); } const queueExecutor = function queueExecutor() { while (orderbookQueue.length) { orderbookQueue[0](); orderbookQueue.shift(); } }; 获取所有单纯形/三角形的某个点是Delaunay三角剖分的一部分吗?

我知道有scipy.spatial.Delaunay函数,它只返回一个点是其中一部分的1个三角形,但我想得到它所属的所有三角形。

Example

所以在这个例子中,当我为点6做find_simplex()时,它只返回三角形2,但我希望它返回三角形1,2,3,4,10和9作为点6是所有这些三角形的一部分。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

您不希望find_simplex因为它是几何的,而不是拓扑的。也就是说,它将一个点视为一个位置而不是三角测量的一个组成部分:几乎所有点都只存在于一个单形中,因此它就是它报告的内容。

而是使用顶点数字。简单的回答是使用simplices属性:

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

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

答案 1 :(得分:0)

您可以通过以下方式有效地获取给定顶点附近的所有单纯形:

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()

Example