鉴于一个点集的Delaunay三角剖分,我应该如何将我的三角测量编入索引以进行快速点定位?
我目前正在遍历所有三角形。对于每个三角形,我都要检查给定点是否在三角形的边界矩形内。如果是,我然后使用几何方程检查三角形。
这很慢。有关如何提高搜索效率的任何想法?
答案 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)
。
也可能是您的查询点的分布允许替代/更简单的方法。