C# 高效地找到给定点所在的Delaunay三角剖分面

C# 高效地找到给定点所在的Delaunay三角剖分面,c#,math,computational-geometry,delaunay,C#,Math,Computational Geometry,Delaunay,给定一个点集的Delaunay三角剖分,我应该如何索引我的三角剖分以进行快速点定位 我现在正在遍历所有的三角形。对于每个三角形,我检查给定的点是否在三角形的边框内。如果是的话,我用几何方程检查三角形 这太慢了。关于如何使此搜索更高效,您有什么想法吗?从快速实用到理论上可靠,以下是您可以使用的三种方法: 构建一个规则的网格,其中每个单元格包含一个与之相交的三角形列表。给定一个查询点,在固定时间内确定包含它的单元格,然后仅将查询点与该单元格列表中的三角形进行比较 构建一个四叉树,其中每个叶单元包含

给定一个点集的Delaunay三角剖分,我应该如何索引我的三角剖分以进行快速点定位

我现在正在遍历所有的三角形。对于每个三角形,我检查给定的点是否在三角形的边框内。如果是的话,我用几何方程检查三角形


这太慢了。关于如何使此搜索更高效,您有什么想法吗?

从快速实用到理论上可靠,以下是您可以使用的三种方法:

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

  • 构建一个四叉树,其中每个叶单元包含与其相交的三角形。将查询点定位到四叉树叶子需要logtime,但这在速度和内存方面都更有效

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


任务完成了,我就是这样结束的:

1) 检查该点是否位于三角形边框内

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

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

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

5) 若相交1次,则表示三角形中的点。否则,就不是三角形了

参考:


解决方案是一个层次结构树,即dendogram或层次结构集群。例如,使用euklidian距离:。或者您可以使用度量树。

解决此点位置问题的常用方法是高效的。使用
O(N.Log(N))
空间,在
O(N.Log(N))
预处理时间之后,它将查询时间减少到每点
O(Log(N))


也可能是查询点的分布允许使用其他/更简单的方法。

根本不清楚您在谈论什么,更不用说您的问题了。发布一些代码,不要假设我们知道您问题的细节,只基于标题中对算法的非常一般的引用。@rbaryyoung对我来说似乎很清楚:给定点集的Delaunay三角剖分,你如何为你的三角测量编制索引以进行快速点定位?@TimothyShields如果问题和你的评论一样清楚,我不会有问题,我怀疑它已经有了一些答案。如果你确定这就是要问的问题,那么我鼓励你编辑它以使其清晰。@TimothyShields谢谢,我的措辞再好不过了。四叉树或BSP也许?我实际上喜欢第一种方法,即等分单元和保存相交三角形,我一直在读关于使用最近邻“遍历”三角剖分的书,虽然我似乎还不能完全理解它的工作方式。如果没有其他发现,我可能会使用你的第一种方法:)@Elia我也从第一种方法开始。只有在第一种方法被证明太慢的情况下,才可以使用更复杂的方法。对于某些区域非常稀疏而其他区域非常密集的点集,它也可能会有困难。如果您感兴趣,我刚刚发布了一个关于事情如何结束的答案。这不会降低渐进意义上算法的效率:检查所有边界框仍然是
O(N)
@Phpdna:假设你指的是dendogram。我看不出蚂蚁之间有什么联系。一种是聚类方法,另一种是有效的几何搜索数据结构。在欧几里德密度图中,查询的复杂性是多少?[梯形分解在渐近意义上是时间和空间最优的。]呃,对不起,这个问题不是关于最近邻搜索,而是关于三角剖分中的点位置。你能给我一个指向搜索算法描述的指针吗?我指的是限定算法复杂性的标准方法()。