查找哪些三角形点在


16

假设我有一个由非重叠三角形组成的2D网格,以及一组点。确定每个点位于哪个三角形的最佳方法是什么? { p } 中号= 1Ñ ķ = 1 Ť ķ{Ťķ}ķ=1个ñ{p一世}一世=1个中号ķ=1个ñŤķ

例如,下面的图像中,我们有,,,所以我想的函数该返回列表。p 2Ť 4 p 3Ť 2 ˚F ˚F p 1p 2p 3= [ 2 4 2 ]p1个Ť2p2Ť4p3Ť2FFp1个p2p3=[242]

在此处输入图片说明

Matlab具有功能Pointlocation,它可以为Delaunay网格实现我想要的功能,但对于普通网格却无法实现。

我的第一个(愚蠢的)想法是,对于所有节点,遍历所有三角形以找出哪个三角形在其中。但是,这种方法效率极低-您可能必须遍历每个点的每个三角形,所以它可以承担工作。p一世p一世Øñ中号

我的下一个想法是,对于所有点,通过最近邻居搜索找到最近的网格节点,然后通过附加到该最近节点的三角形查看。在这种情况下,工作将是,其中是连接到网格中任何节点的三角形的最大数量。这种方法有几个可解决但令人讨厌的问题,p一世Ø一种中号ØGñ一种

  • 它要求实现有效的最近邻居搜索(或查找具有该功能的库),这可能是一项不平凡的任务。
  • 它需要存储一个三角形列表,每个三角形都附加到每个节点上,而我的代码当前尚未设置该列表-现在只有一个节点坐标列表和一个元素列表。

总体而言,这似乎不太雅致,我认为应该有更好的方法。这肯定是一个经常出现的问题,所以我想知道是否有人可以推荐最佳的方法来找到节点在理论上或在可用库方面的三角形。

谢谢!

Answers:


16

通常的随机边缘跳变方法应该起作用。基本上,从网格的任何三角形开始,然后确定目标点位于哪条边的相对侧。也就是说,确定哪些边缘在延伸到一条线时将点与三角形的内部分开。当有两种可能性时,随机选择一种,然后考虑与该共享边相邻的三角形,然后重复。随机化应该使该方法对于Delaunay三角剖分收敛为1的概率,我想不出对任意三角剖分均无效的原因。

编辑:我应该补充一点,对于单个点,边跳应该为并且具有一个合理的常数,因此对于M点,它的跳变应该为O M log N 。但是,如果您按地点对点排序(例如首先使用希尔伯特曲线排序),则可以使用上一个查询的三角形初始化每个新查询,以进一步减少运行时间(我不是CS理论家,所以我可以)告诉你大O将在那里)。Ø日志ñØ中号日志ñ中号

Edit2:找到此PDF,描述了这样的“行走”方案,可以保证终止方案,并回顾了更为幼稚的方法。

使用四叉树的另一种替代方法是使用“三角剖分”层次结构。参见Olivier Devillers。改进的增量随机Delaunay三角剖分。在过程中。14日。ACM座谈会。计算 Geom。,第106-115页,1998年。它最适用于Delaunay三角剖分,但也适用于非Delaunay。

基本上,您要做的任何加快点定位的操作都需要构造辅助数据结构。对于四叉树或其他空间细分,您需要构建细分树。如果是边跳边,则需要在拓扑结构附近建立三角形。三角剖分层次结构还需要构建一棵更粗的三角剖分树。


维克多(Victor)-您是否知道任何暗示跳边方法的开源代码?它看起来很适合我的情况。(由traingualr网格中的当前场驱动的粒子跟踪模型)-谢谢
克里斯·巴克

我有此代码,可以将其发送给您。它在C / C ++中。还没有时间清理它并发布在Github上。我一生中至少要写两次,一次是使用半边数据结构,再一次是四边形,但是当这些数据不可用并且您需要自己构建拓扑结构时,可以很容易地使用它。在我的个人资料页面上查找我的网站,您可以在其中找到联系信息。我们可以进一步离线讨论。
维克多·刘

我已经接近完成使用Hilbert曲线排序和随机三角游走的方法在matlab中实现此功能。它是研究代码:未优化,未记录等,但仍相当快-如果您感兴趣,我可以给您代码。
Nick Alger 2012年

2
关于:“”“跳边应该是O(logN)”“”我没有看到。例如,在大的长三角形条带的病理情况下(例如仅在三角形宽度上的狭窄通道),在最坏的情况下,您需要从一个三角形一直跳到下一个三角形,直到最后。在一般情况下,一半。因此,如果将三角形的数量加倍,则将为O(N)。在更常见的三角形正方形排列的情况下,我期望O(sqrt(N))。还是我错过了什么?
克里斯

@Chris-欢迎来到scicomp!作为scicomp管家的一部分,我已将您的答案和随后的对话迁移为对Victor答案的评论。我们期待您的参与。
阿隆·艾玛迪亚

8

我不相信您的解决方案实际上是正确的。考虑一下您拥有以下节点的情况:

  • 答:(-3,1)
  • B:(0、2)
  • C:(3,1)
  • D:(0,-5)

有三角形ABC和ACD。现在,B是最接近原点的点,但是原点位于不包含B的三角形ACD中。

Øñ中号

我会考虑构建包含三角形本身的四叉树的选项。即,您有一个存储在每个节点(对应于边界框)中的四元树:

  • 框被分割时的坐标,或者四个子树的边界框;
  • 指向子树的指针;
  • 三角形的集合完全落在此矩形的边界框中,但不完全落在四个子树的任何一个中。换句话说,与四叉树的两个细分线段中的任意一个相交的三角形。

ññ日志ñØñ中号


嗯,你是对的。另一方面,如果三角剖分是Delaunay,我认为最近的邻居可以工作。它对我要执行的操作过于严格,但是在Delaunay情况下,请考虑对偶Voronoi图-Voronoi单元是最接近节点的点集,并且delaunay三角形的边缘都与Voronoi的边缘相交单元成直角,因此任何点都必须在与其最接近的节点相连的三角形中。我想知道这是否是matlab的pointLocation函数在后台运行的方式。
Nick Alger 2012年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.