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

时间:2013-04-12 10:26:52

标签: python geometry interpolation triangulation delaunay

我已经绘制了n随机点(黑点)并使用了delaunay三角剖分,现在我想插入m随机评估点(红点) )所以我需要计算评估点所在的三角形。

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

4 个答案:

答案 0 :(得分:2)

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

为了节省计算,您可以计算每个三角形的点的最小和最大X和Y坐标。如果点的X和Y坐标不在最小值和最大值之内,则可以立即跳过检查该三角形。如果它不在限定三角形的矩形内,则该点不能在其中。

答案 1 :(得分:1)

我假设除了公共边之外三角形不相交。

您不希望独立检查每个三角形(或其子集)。主要原因是计算错误 - 由于它们,您可能会在“内部”回答多个三角形(或零),这可能会破坏程序的逻辑。

更强大的方式是:

  1. 找到与该点最近的边缘
  2. 选择触及此边缘的三角形之一
  3. 检查该三角形(该点与第三个三角形顶点位于同一侧)
  4. 如果“内部” - 返回此三角形
  5. 如果“在外面” - 在此边缘返回另一个三角形(如果没有其他三角形,则返回“无”)
  6. 即使由于计算错误而返回错误的三角形,仍然只有一个三角形,并且它将足够接近它以接受这样的错误。

    对于#1,您可以像Michael Wild所说的那样使用四叉树之类的东西。

答案 2 :(得分:1)

Delaunay三角剖分本身就是一种搜索数据结构。您的Delaunay三角测量实现可能具有位置功能。你是如何计算你的分数的Delaunay三角剖分的?

CGAL具有2D和3D三角测量的实现。生成的数据结构能够使用来自给定点的步行来定位任何点。请参阅示例that chapter of the manual。 CGAL是一个C ++库,但它有python bindings

答案 3 :(得分:1)

这个简单的例子对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可视化(代码已省略)

enter image description here

虚线的青色线现在将要插入的点连接到它所在的三角形的顶点。黑色线条是凸包,实心青色线条是delaunay三角剖分。