Python 如何找到包含给定点的delaunay三角剖分面

Python 如何找到包含给定点的delaunay三角剖分面,python,geometry,interpolation,triangulation,delaunay,Python,Geometry,Interpolation,Triangulation,Delaunay,我已经绘制了n个随机点,黑色点,并使用delaunay三角剖分,现在我想插值m个随机评估点,红色点,所以我需要计算评估点在哪个三角形内 计算每个点的三角形顶点的方法是什么? 对于给定的三角形ABC,如果点与点C位于直线AB的同一侧,与点a位于直线BC的同一侧,与点B位于直线AC的同一侧,则点位于三角形内部。您可以为每个三角形预先优化此检查,并对所有三角形进行检查,直到找到它所在的三角形为止。有关更多详细信息,请参阅 为了节省计算,可以计算每个三角形点的最小和最大X和Y坐标。如果点的X和Y坐标不在

我已经绘制了n个随机点,黑色点,并使用delaunay三角剖分,现在我想插值m个随机评估点,红色点,所以我需要计算评估点在哪个三角形内

计算每个点的三角形顶点的方法是什么?

对于给定的三角形ABC,如果点与点C位于直线AB的同一侧,与点a位于直线BC的同一侧,与点B位于直线AC的同一侧,则点位于三角形内部。您可以为每个三角形预先优化此检查,并对所有三角形进行检查,直到找到它所在的三角形为止。有关更多详细信息,请参阅


为了节省计算,可以计算每个三角形点的最小和最大X和Y坐标。如果点的X和Y坐标不在最小值和最大值范围内,可以立即跳过检查该三角形。如果该点不在三角形边界的矩形内,则该点不能在该矩形内。

我将假定三角形除了公共边外不相交

您不希望单独检查每个三角形或它们的子集。主要原因是计算错误——由于这些错误,您可能会得到多个三角形或零的内部答案,这可能会破坏程序的逻辑

更可靠的方法是:

找到离点最近的边 选择一个与此边接触的三角形 对该三角形进行一次检查,该点与第三个三角形顶点位于同一侧 如果在里面-返回这个三角形 如果在外侧-返回此边上的另一个三角形,如果没有其他三角形,则不返回任何三角形 即使由于计算错误而返回错误的三角形,仍然只有一个三角形,并且点离它足够近,可以接受此类错误


对于1,你可以像Michael Wild建议的那样使用四叉树。

Delaunay三角剖分本身就是一种搜索数据结构。您的Delaunay三角剖分实现可能具有定位函数。如何计算点的Delaunay三角剖分


具有二维和三维三角剖分的实现。生成的数据结构能够使用从给定点开始的漫游来定位任何点。例如,见。CGAL是一个C++库,但它具有.</P> < P>这个简单的例子三角化了10个随机点,生成了另外3个随机点,如果它们落入一个三角形中,则给出顶点:

import numpy as np
from pyhull.delaunay import DelaunayTri

def sign(a,b,c):
    return (a[0]-c[0])*(b[1]-c[1])-(b[0]-c[0])*(a[1]-c[1])

def findfacet(p,simplice):
    c,b,a = simplice.coords
    b1 = sign(p,a,b) < 0.0
    b2 = sign(p,b,c) < 0.0
    b3 = sign(p,c,a) < 0.0
    return b1 == b2 == b3

data = np.random.randn(10, 2)
dtri = DelaunayTri(data)

interpolate = np.random.randn(3, 2)

for point in interpolate:
    for triangle in dtri.simplices:
        if findfacet(point,triangle):
            print "Point",point,"inside",triangle.coords
        break
使用matplotlib可视化省略的代码:


现在,点青色线连接要使用其所在三角形的顶点进行插值的点。黑线是凸面外壳,实线是delaunay三角剖分

你给这个问题贴上了“三角测量”的标签。这是否意味着三角形不相交?如果可能的话,它们会形成某个对象的三角剖分吗?你可以看看SciPy,看起来它有问题的一些实现。你可以从这里开始,我对你的问题做了大量的编辑,特别是关于delaunay三角剖分,因为这是一个特殊的主题。当然,您可以自由回滚,但我觉得这更合适:现有的答案仍然适用,当然,但我觉得对于delaunay三角剖分存在更有效的算法。此外,MATLAB使用Qhull解决这个问题,您可以不看python,但仍然可以给您一个想法。@unkulunkulu我正在使用,我在这方面没有先验知识,因此所有答案、参考资料等都很有用。如果三角形的数量非常大,构建四叉树结构可能会有回报,这样可以更快地搜索需要检查的相关三角形。无需四叉树或暴力检查,有一种简单的图形遍历方法,只从任意随机顶点开始沿着三角形的边进行遍历。@WhitAngl您能提供一个参考吗?我对Irineau的答案投了赞成票,这将使您走上正确的轨道。我从来没有亲自编写过这个搜索,但我知道有人这样做,并向我解释了这些原则,这是沿着伊里诺的方向进行的。这是一个相当标准的东西,例如,查看函数TRFIND in。否决了其他没有意义的答案,包括David的答案。这些解决方案不标准且效率低下。感谢您提供的信息,非常有用。现在已经实现了简单的方法。看看你是否感兴趣。Delaunay三角剖分对很多事情都很有用,不仅仅是空间搜索。所以我不同意一个实现必须有一个定位函数。我对我的措辞感到抱歉。当我说:您的Delaunay三角剖分实现必须具有定位功能时,该功能必须是一个may。