有效地找到Delaunay三角剖分面,这是一个给定的点

时间:2014-06-16 13:59:46

标签: c# math computational-geometry delaunay

鉴于一个点集的Delaunay三角剖分,我应该如何将我的三角测量编入索引以进行快速点定位?

我目前正在遍历所有三角形。对于每个三角形,我都要检查给定点是否在三角形的边界矩形内。如果是,我然后使用几何方程检查三角形。

这很慢。有关如何提高搜索效率的任何想法?

4 个答案:

答案 0 :(得分:2)

任务已完成,这就是我最终完成任务的方式:

1)检查点是否位于三角形边界矩形内。

2)将点指定为水平线的起点,以最大宽度结束。

3)检查(1)中找到的三角形与(2)中的线的交点。

4)如果三角形相交,检查水平线与三角形相交的次数。

5)如果相交1次,则表示指向三角形。否则,不是三角形。

参考:

Fast generation of points inside triangulated objects obtained by cross-sectional contours

答案 1 :(得分:1)

从快速实用到理论上健壮,这里有三种方法可供您使用:

  • 构造一个规则网格,其中每个单元格包含与其相交的三角形列表。给定一个查询点,在恒定时间内确定包含它的单元格,然后将您的查询点与该单元格列表中的那些三角形进行比较。

  • 构造一个四叉树,其中每个叶子单元格包含与其相交的三角形。将查询点本地化为四叉树叶子需要logtime,但这在整体速度和内存方面都更有效。

  • 在所有三角形上向下扫描一条水平线。点集中的点对应于事件。在每个事件中,一些三角形开始与扫掠线相交,而其他三角形则停止与扫掠线相交。您可以使用不可变(也称为持久性)的有序映射数据结构来有效地表示它。 map<double, sweepstate>,其中键是事件中扫描线的y轴截距,sweepstate是线段对的排序列表(对应于三角形的左侧和右侧)。给定一个查询点,首先使用其y值来查找sweepstate,然后进行单个梯形包含测试。 (两条水平扫描线和它们之间的两条线段形成一个梯形。)

答案 2 :(得分:0)

解决方案是分层树,即。树状图或分层聚类。例如,使用euklidian距离:http://en.m.wikipedia.org/wiki/Hierarchical_clustering。或者您可以使用指标树。

答案 3 :(得分:0)

解决此点位置问题的常用方法是高效Trapezoidal Decomposition。在O(Log(N))预处理时间之后,使用O(N.Log(N))空格,每个点的查询时间缩短为O(N)

也可能是您的查询点的分布允许替代/更简单的方法。