【问题标题】:Efficiently find Delaunay Triangulation face, which a given point lies on有效地找到给定点所在的 Delaunay 三角剖分面
【发布时间】:2014-06-20 18:41:22
【问题描述】:

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

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

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

【问题讨论】:

  • 根本不清楚你在说什么,更别提你的问题是什么了。发布一些代码,不要假设我们知道您的问题的具体情况,仅基于您标题中对算法的非常笼统的引用。
  • @RBarryYoung 对我来说似乎很清楚:给定点集的 Delaunay 三角剖分,您如何索引您的三角剖分以进行快速点定位?
  • @TimothyShields 如果问题和您的评论一样清楚,我不会有问题,我怀疑它已经有了一些答案。如果您确定这是所要求的,那么我鼓励您进行编辑以使其清晰。
  • @TimothyShields 谢谢,我的措辞再好不过了。
  • 四叉树还是 BSP?

标签: c# math computational-geometry delaunay


【解决方案1】:

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

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

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

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

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

5) 如果相交 1 次,则表示三角形中的点。否则,不在三角形中。

参考:

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

【讨论】:

  • 这不会在渐近意义上降低算法的效率:检查所有边界框仍然是O(N)
【解决方案2】:

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

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

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

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

【讨论】:

  • 我实际上喜欢相等单元格的第一种方法并保存相交的三角形,我一直在阅读有关使用最近邻居“遍历”三角剖分的内容,尽管我似乎无法完全理解它的方式还有效。如果没有其他发现,我可能会使用你的第一种方法:)
  • @Elia 我也从第一种方法开始。如果第一种方法被证明太慢,请只列出更复杂的方法。对于某些区域非常稀疏而其他区域非常密集的点集,它也可能存在困难。
  • 如果您有兴趣,我刚刚发布了关于事情如何结束的答案。
【解决方案3】:

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

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

【讨论】:

  • @Phpdna:假设您的意思是树状图。我没有看到蚂蚁连接。一种是聚类方法,另一种是高效的几何搜索数据结构。
  • 欧几里得树状图中查询的复杂度是多少? [梯形分解在渐近意义上是时间和空间最优的。]
  • 呃,抱歉,这个问题不是关于最近邻搜索,而是关于三角测量中的点位置。
  • 你能给我一个关于搜索算法描述的指针吗?
  • 我指的是限定算法复杂度的标准方法 (en.wikipedia.org/wiki/Asymptotic_computational_complexity)。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-10
    • 2015-01-07
    • 2016-04-15
    • 2019-04-18
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    相关资源
    最近更新 更多